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

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

最終更新日:Dec 28, 2024

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

前提条件

使用上の注意

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

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

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

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

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

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

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

API 操作

アトミックカウンター関連の操作が updateRow 操作に追加されました。次の表に、アトミックカウンター関連の操作を示します。

操作

説明

updateOfAttributeColumns

更新タイプに INCREMENT を指定して、列の値を特定の整数値だけ増減します。

returnContent

アトミックカウンターを実装するために操作が実行される列のうち、値を返したい列の名前を指定します。

パラメーター

パラメーター

説明

tableName

データテーブルの名前。

columnName

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

value

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

returnColumns

アトミックカウンターを実装するために操作が実行される列のうち、値を返したい列の名前を指定します。

returnType

戻り値の型を TableStore.ReturnType.AfterModify に設定して、アトミックカウンターを実装するために操作が実行される列の値を返します。

次のサンプルコードは、updateRow 操作を呼び出してデータを更新するときに、更新タイプとして INCREMENT を使用して INTEGER 型の属性列の値を更新する方法の例を示しています。

var params = {
  tableName: "<Your-Table-Name>",
  condition: new TableStore.Condition(TableStore.RowExistenceExpectation.EXPECT_EXIST, null),
  primaryKey: [{'pk0': Long.fromNumber(1)}],
  // price 列をアトミックカウンターとして指定し、アトミックカウンターの値を 10 増やします。タイムスタンプは指定できません。
  updateOfAttributeColumns: [
    {'INCREMENT': [{'price': Long.fromNumber(10)}]}
  ],
  // 戻り値の型を TableStore.ReturnType.AfterModify に設定し、アトミックカウンターを実装するために操作が実行される列の値を返します。
  returnContent: {
    returnColumns: ["price"],
    returnType: TableStore.ReturnType.AfterModify
  }
};

client.updateRow(params,
  function (err, data) {
    if (err) {
      console.log('error:', err);
      return;
    }

    console.log('success:', JSON.stringify(data, null, 2));
  });