Tablestore SDK for Java は、行レベルで整数属性列をアトミックにインクリメントまたはデクリメントし、同一リクエスト内で更新後の値を返すことができます。
前提条件
Tablestore SDK for Java をインストールし、クライアントを初期化します。
説明
increment(Column) を呼び出して、指定した整数列をアトミックに更新します。正の値でインクリメント、負の値でデクリメントが行われます。Tablestore は行レベルの原子性を保証し、更新後に新しいデータバージョンを書き込みます。同一リクエスト内で更新後の値を返すには、addReturnColumn(String) を呼び出し、returnType を RT_AFTER_MODIFY に設定します。
public UpdateRowResponse updateRow(UpdateRowRequest updateRowRequest) throws TableStoreException, ClientException
public RowUpdateChange increment(Column column)
public void addReturnColumn(String columnName)
public void setReturnType(ReturnType returnType)
次の例では、counter_demo テーブル内のプライマリキー pk0 を持つ行の price 列を 10 インクリメントし、同一リクエスト内で更新後の値を読み取ります。
PrimaryKey primaryKey = PrimaryKeyBuilder.createPrimaryKeyBuilder()
.addPrimaryKeyColumn("id", PrimaryKeyValue.fromString("pk0"))
.build();
RowUpdateChange rowUpdateChange = new RowUpdateChange("counter_demo", primaryKey);
// price 列を 10 インクリメント (デクリメントする場合は負の値を使用)
rowUpdateChange.increment(new Column("price", ColumnValue.fromLong(10)));
// 同一リクエスト内で更新後の列値を返す
rowUpdateChange.addReturnColumn("price");
rowUpdateChange.setReturnType(ReturnType.RT_AFTER_MODIFY);
UpdateRowResponse response = client.updateRow(new UpdateRowRequest(rowUpdateChange));
Row row = response.getRow();
System.out.println("Updated price: " + row.getLatestColumn("price").getValue().asLong());
パラメーター
リクエスト設定
UpdateRowRequest には次のパラメーターが含まれます。
|
名前 |
タイプ |
説明 |
|
rowChange (必須) |
RowUpdateChange |
単一行更新の設定です。 |
|
transactionId (オプション) |
String |
ローカルトランザクション ID です。ローカルトランザクション内でアトミックカウンター操作を実行する場合にのみ、このパラメーターを指定します。 ID の取得方法と使用方法については、「ローカルトランザクションの使用」をご参照ください。 |
行更新設定
UpdateRowRequest の rowChange パラメーターは、RowUpdateChange 型です。
|
名前 |
タイプ |
説明 |
|
tableName (必須) |
String |
データテーブルの名前です。 |
|
primaryKey (必須) |
PrimaryKey |
対象行のプライマリキーです。 |
|
columnsToUpdate (必須) |
List<Pair<Column, Type>> |
更新する属性列です。 |
|
condition (オプション) |
Condition |
条件付き更新の設定です。行が条件を満たす場合にのみ、アトミックカウンター操作が実行されます。 条件の設定方法については、「条件付き更新の使用」をご参照ください。 |
|
returnType (オプション) |
ReturnType |
リターンタイプです。デフォルト値: |
|
returnColumnNames (オプション) |
Set<String> |
更新後の値を返す対象となる列の名前です。 |
カウンター列
increment() によって UpdateRowRequest.rowChange.columnsToUpdate に追加される各要素には、Column が含まれます。
|
名前 |
タイプ |
説明 |
|
name (必須) |
String |
アトミックカウンター操作を実行する属性列の名前です。 |
|
value (必須) |
ColumnValue |
整数のインクリメント値です。正の値でインクリメント、負の値でデクリメントが行われます。結果がオーバーフローしないようにしてください。対象列が存在しない場合、初期値は 0 として扱われます。 |
応答
|
名前 |
タイプ |
説明 |
|
row |
Row |
|
制限事項
-
アトミックカウンター操作は整数型の列のみをサポートします。列が存在するものの整数型でない場合、操作は
OTSParameterInvalidエラーを返します。 -
アトミックカウンター操作は最新バージョンにのみ適用され、ユーザー指定のタイムスタンプは受け付けません。
-
単一の更新リクエスト内では、同じ列に対してアトミックカウンター操作と他の操作 (上書きや削除など) を組み合わせることはできません。
-
BatchWriteRowリクエストでは、アトミックカウンター操作を含む行は 1 回のみ指定できます。
アトミックカウンター操作は、ネットワークタイムアウトやシステムエラーにより失敗する可能性があります。リトライによってインクリメント値が二重に適用され、カウンターが意図した値よりも高く (または低く) なる場合があります。二重カウントを回避するには、条件付き更新を使用して、現在の状態に基づいて値を更新してください。