すべてのプロダクト
Search
ドキュメントセンター

Tablestore:アトミックカウンター機能を使用する

最終更新日:Dec 28, 2024

オンラインアプリケーションでカウンターを使用する場合、アトミックカウンター機能を使用できます。この機能を使用するには、列をアトミックカウンターとして指定し、その列に対してアトミックカウンター操作を実行します。

前提条件

  • OTSClient インスタンスが初期化されていること。詳細については、クライアントの初期化を参照してください。

  • データテーブルが作成され、データがデータテーブルに書き込まれていること。

使用上の注意

  • アトミックカウンターは INTEGER 型の列にのみ実装できます。

  • アトミックカウンターとして指定された列がデータの書き込み前に存在しない場合、列のデフォルト値は 0 になります。アトミックカウンターとして指定された列が INTEGER 型ではない場合、OTSParameterInvalid エラーが発生します。

  • アトミックカウンターは正または負の数を使用して更新できますが、整数オーバーフローは避ける必要があります。整数オーバーフローが発生した場合、OTSParameterInvalid エラーが返されます。

  • デフォルトでは、アトミックカウンターの値は行更新リクエストへの応答では返されません。アトミックカウンターの更新された値を返すように指定できます。

  • 1 つの更新リクエストで、列をアトミックカウンターとして指定し、その列を更新することはできません。たとえば、列 A をアトミックカウンターとして設定した場合、同時に上書きや削除などの他の操作をその列に対して実行することはできません。

  • BatchWriteRow リクエストを送信することで、同じ行に対して複数の更新操作を実行できます。ただし、行に対してアトミックカウンター操作を実行する場合、BatchWriteRow リクエストではその行に対して 1 つの更新操作のみ実行できます。

  • アトミックカウンターの最新バージョンの値のみを更新できます。指定したバージョンのアトミックカウンターの値を更新することはできません。更新操作が完了すると、新しいバージョンのデータが行のアトミックカウンターに挿入されます。

API 操作

アトミックカウンター機能を使用するために呼び出すことができる API 操作は、rowUpdateChange クラスに追加されています。次の表に、操作を示します。

操作

説明

RowUpdateChange increment(Column column)

列の値を数値分だけ増減します。

void addReturnColumn(String columnName)

アトミックカウンターを実装するために操作が実行される列の名前を指定します。この API 操作は、列の名前を返すために呼び出されます。

void setReturnType(ReturnType returnType)

アトミックカウンターの値を返すためのデータ型を指定します。

パラメーター

パラメーター

説明

tableName

データテーブルの名前。

columnName

アトミックカウンター操作を実行する列の名前。INTEGER 型の列のみ指定できます。

value

列の値の増分または減分。

returnType

このパラメーターを ReturnType.RT_AFTER_MODIFY に設定すると、アトミックカウンターの値が返されます。

次のサンプルコードは、rowUpdateChange を使用してアトミックカウンターの値を増やし、増加した値を返す方法の例を示しています。

private static void incrementByUpdateRowApi(SyncClient client) {
    // プライマリキーを構築します。
    PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    primaryKeyBuilder.addPrimaryKeyColumn("<PRIMARY_KEY_NAME>", PrimaryKeyValue.fromString("pk0"));
    PrimaryKey primaryKey = primaryKeyBuilder.build();
    // データテーブルの名前を指定します。
    RowUpdateChange rowUpdateChange = new RowUpdateChange("<TABLE_NAME>", primaryKey); 

    // price 列をアトミックカウンターとして指定し、アトミックカウンターの値を 10 増やします。タイムスタンプは指定できません。
    rowUpdateChange.increment(new Column("price", ColumnValue.fromLong(10)));

    // returnType パラメーターを ReturnType.RT_AFTER_MODIFY に設定して、アトミックカウンターの値を返します。
    rowUpdateChange.addReturnColumn("price");
    rowUpdateChange.setReturnType(ReturnType.RT_AFTER_MODIFY);

    // 行を更新するリクエストを開始します。
    UpdateRowResponse response = client.updateRow(new UpdateRowRequest(rowUpdateChange));

    // 更新された値を表示します。
    Row row = response.getRow();
    System.out.println(row);
}