アトミックカウンター機能を使用すると、読み取り・変更・書き込みサイクルを必要とせずに、単一のスレッドセーフな操作で INTEGER 型の列の値を増加または減少させることができます。
前提条件
-
OTSClient インスタンスが初期化されている必要があります。詳細については、「OTSClient インスタンスの初期化」をご参照ください。
-
データテーブルが作成され、データが書き込まれている必要があります。詳細については、「データテーブルの作成」および「データの書き込み」をご参照ください。
注意事項
-
アトミックカウンターは INTEGER 型の列でのみ実装できます。
-
アトミックカウンターとして指定された列がデータ書き込み前に存在しない場合、その列のデフォルト値は 0 になります。また、アトミックカウンターとして指定された列が INTEGER 型でない場合、OTSParameterInvalid エラーが発生します。
-
正または負の数値を使用してアトミックカウンターを更新できますが、整数オーバーフローを回避する必要があります。整数オーバーフローが発生した場合、OTSParameterInvalid エラーが返されます。
-
デフォルトでは、行更新リクエストに対する応答にアトミックカウンターの値は含まれません。ただし、更新後のアトミックカウンターの値を返すように指定できます。
-
同一の更新リクエスト内で、ある列をアトミックカウンターとして指定しつつ、その列に対して他の更新操作(上書きや削除など)を同時に行うことはできません。たとえば、列 A をアトミックカウンターに設定した場合、その列に対して同時に上書きや削除などの他の操作を行うことはできません。
-
BatchWriteRow リクエストを送信することで、同じ行に対して複数の更新操作を実行できます。ただし、ある行に対してアトミックカウンター操作を実行する場合は、その BatchWriteRow リクエスト内でその行に対する更新操作は 1 回のみ実行できます。
-
アトミックカウンターの最新バージョンの値のみを更新できます。特定のバージョンのアトミックカウンター値を更新することはできません。更新操作が完了すると、その行のアトミックカウンターに新しいバージョンのデータが挿入されます。
API オペレーション
アトミックカウンター操作は RowUpdateChange クラスを通じて提供されます。
|
操作 |
説明 |
|
RowUpdateChange Increment(Column) |
INTEGER 型の列の値を指定された量だけ増加または減少させます。 |
|
List<String> ReturnColumnNames |
アトミックカウンター操作後に返す列を指定します。 |
|
ReturnType |
アトミックカウンターの結果の返却形式を指定します。 |
パラメーター
|
パラメーター |
説明 |
|
TableName |
データテーブルの名前です。 |
|
ColumnName |
アトミックカウンター操作を適用する列です。INTEGER 型の列のみがサポートされます。 |
|
Value |
列の値に加算または減算する量です。減算するには負の数値を使用します。 |
|
ReturnColumnNames |
操作後に返す列です。 |
|
ReturnType |
操作後の更新された列の値を返すには、 |
例
次の例では、INTEGER 型の列を増加させ、更新後の値を返します。
public static void Increment(int incrementValue)
{
Console.WriteLine("Start set increment column...");
OTSClient otsClient = Config.GetClient();
// 行のプライマリキーを指定します。プライマリキーは、テーブル作成時に TableMeta で指定したものと一致している必要があります。
PrimaryKey primaryKey = new PrimaryKey
{
{ Pk1, new ColumnValue(0) },
{ Pk2, new ColumnValue("abc") }
};
RowUpdateChange rowUpdateChange = new RowUpdateChange(TableName, primaryKey); // データテーブルの名前を指定します。
// アトミックカウンター操作が実行された列の値を返すために、ReturnType パラメーターを ReturnType.RT_AFTER_MODIFY に設定します。
rowUpdateChange.ReturnType = ReturnType.RT_AFTER_MODIFY;
rowUpdateChange.ReturnColumnNames = new List<string>() { IncrementCol};
// アトミックカウンター操作を実行する列を指定します。列の値は 0 から始まり、incrementValue パラメーターで指定された数値分増加します。
rowUpdateChange.Increment(new Column(IncrementCol, new ColumnValue(incrementValue)));
UpdateRowRequest updateRowRequest = new UpdateRowRequest(rowUpdateChange);
var response = otsClient.UpdateRow(updateRowRequest);
Console.WriteLine("set Increment column succeed Increment result:" + response.Row.GetColumns()[0].Value);
}