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

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

最終更新日:Mar 27, 2025

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

シナリオ

アトミックカウンターは、さまざまなトピックのリアルタイム ページビュー (PV) 数や一部のオンライン アプリケーションのメッセージ数など、カウント操作を迅速に実行する必要があるシナリオや、特定の列の値を 1 ずつ増やす必要があるシナリオに適しています。

概要

アトミックカウンターは、強力な整合性によって発生する書き込みパフォーマンスのオーバーヘッドを削減します。サーバーにリクエストを送信して読み取り、変更、書き込み (RMW) 操作を実行する場合、サーバーは行をロックして行に対して操作を実行します。強力なデータ整合性を確保するために、データベース サーバー上のアトミックカウンターを更新して、書き込みパフォーマンスを向上させることができます。

重要

アトミックカウンター操作でネットワーク タイムアウトまたはシステム障害が発生した場合、エラーが発生する可能性があります。この場合、操作を再試行できます。ただし、アトミックカウンターが 2 回更新され、アトミックカウンターの値が小さくなったり大きくなったりする可能性があります。条件付き更新機能を使用して、アトミックカウンターの値を正確に更新することをお勧めします。詳細については、「条件付き更新」をご参照ください。

アトミックカウンター機能を使用して、行のデータに関するリアルタイム統計を収集できます。UpdateRow 操作を呼び出して、アトミックカウンターの値を増減したり、更新されたアトミックカウンターの値を返したりするなど、アトミックカウンターに対する操作を実行することで、アトミックカウンター機能を実装できます。

たとえば、画像のメタデータを保存し、画像の数をカウントするために Tablestore テーブルを作成するとします。テーブルの各行にはユーザー ID があります。行の 1 つの列は、画像のメタデータを保存するために使用されます。行の別の列は、行にメタデータが保存されている画像のリアルタイム数をカウントするためのアトミックカウンターとして使用されます。

  • UpdateRow 操作を呼び出して画像のメタデータを行に追加すると、アトミックカウンターの値が 1 増加します。

  • UpdateRow 操作を呼び出して行から画像のメタデータを削除すると、アトミックカウンターの値が 1 減少します。

  • GetRow 操作を呼び出してアトミックカウンターの値を読み取り、行にメタデータが保存されている画像の数を確認できます。

これにより、強力なデータベース整合性が確保されます。行に画像のメタデータを追加すると、行のアトミックカウンターの値は 1 減少するのではなく、1 増加します。

使用上の注意

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

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

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

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

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

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

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

メソッド

重要

アトミックカウンター機能は、Tablestore SDK を使用する場合にのみ使用できます。

Tablestore SDK for JavaTablestore SDK for GoTablestore SDK for PythonTablestore SDK for Node.jsTablestore SDK for .NETTablestore SDK for PHP を使用して、アトミックカウンター機能を使用できます。この例では、Tablestore SDK for Java を使用します。

次のコードは、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.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);
    }

課金

アトミックカウンターの実装は、既存の課金ルールには影響しません。課金の詳細については、「課金の概要」をご参照ください。