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

Tablestore:ローカル トランザクション

最終更新日:Dec 28, 2024

データテーブルのローカル トランザクション機能を有効にすると、指定されたパーティションキー値に基づいてローカル トランザクションを作成し、ローカル トランザクション内のデータに対して読み取りおよび書き込み操作を実行できます。ローカル トランザクション機能を使用して、1 つ以上の行を読み書きするアトミック操作を実行できます。

ローカル トランザクションを使用して、同じパーティションキーを共有するデータに対する操作がすべて成功するか、すべて失敗するかを指定できます。ローカル トランザクションの分離レベルは Read Committed です。

前提条件

ローカル トランザクション機能を使用する

  1. startLocalTransaction を使用して、指定されたパーティションキー値に基づいてローカル トランザクションを作成し、ローカル トランザクションの ID を取得します。

  2. ローカル トランザクション内のデータを読み書きします。

    GetRow、PutRow、DeleteRow、UpdateRow、BatchWriteRow、および GetRange 操作を呼び出して、ローカル トランザクション内のデータに対する操作を実行できます。

  3. commitTransaction を使用してローカル トランザクションをコミットするか、abortTransaction を使用してローカル トランザクションを中止します。

使用上の注意

  • 自動インクリメント主キー列機能とローカル トランザクション機能を同時に使用することはできません。

  • ローカル トランザクションでの同時実行操作を制御するために、悲観的ロックが使用されます。

  • ローカル トランザクションの有効期間は最大 60 秒です。

    ローカル トランザクションが 60 秒以内にコミットまたは中止されない場合、Tablestore サーバーはローカル トランザクションがタイムアウトしたと判断し、トランザクションを中止します。

  • タイムアウトエラーが返された場合でも、Tablestore サーバーでトランザクションが作成される場合があります。この場合、作成されたトランザクションがタイムアウトした後に、トランザクション作成リクエストを再送信できます。

  • ローカル トランザクションがコミットされていない場合、無効になる可能性があります。この場合、このトランザクションの操作を再試行してください。

  • ローカル トランザクション内のデータに対して書き込み操作が実行されていない場合、コミット操作と中止操作は同じ効果があります。

  • Tablestore は、ローカル トランザクション内のデータに対する読み取りおよび書き込み操作に次の制限を課します:

    • ローカル トランザクション ID を使用して、トランザクションの作成に使用されたパーティションキー値に基づいて指定された範囲を超えるデータにアクセスすることはできません。

    • 同じトランザクション内のすべての書き込みリクエストのパーティションキー値は、トランザクションの作成に使用されたパーティションキー値と同じである必要があります。この制限は、読み取りリクエストには適用されません。

    • ローカル トランザクションは、一度に 1 つのリクエストでのみ使用できます。ローカル トランザクションが使用中の場合、同じローカル トランザクション ID を使用する他の操作は失敗します。

    • ローカル トランザクション内のデータに対する 2 つの連続した読み取りまたは書き込み操作の最大間隔は 60 秒です。

      ローカル トランザクション内のデータに対して 60 秒以上読み取りまたは書き込み操作が実行されない場合、Tablestore サーバーはトランザクションがタイムアウトしたと判断し、トランザクションを中止します。

    • 各トランザクションに最大 4 MB のデータを書き込むことができます。各トランザクションに書き込まれるデータ量は、通常の書き込みリクエストと同じ方法で計算されます。

    • セルにバージョン番号を指定しない場合、Tablestore サーバーは、トランザクションのコミット時ではなく、セルがトランザクションに書き込まれたときに、通常の方法でセルにバージョン番号を自動的に割り当てます。

    • BatchWriteRow リクエストにローカル トランザクション ID が含まれている場合、リクエスト内のすべての行は、ローカル トランザクション ID に一致するテーブルにのみ書き込むことができます。

    • ローカル トランザクションを使用する場合、ローカル トランザクションが作成されたパーティションキー値のデータに書き込みロックが追加されます。ローカル トランザクション ID を含み、ローカル トランザクション内のデータを書き込むために開始された書き込みリクエストのみが成功します。他の非トランザクションリクエスト、または他のローカル トランザクションの ID を含み、ローカル トランザクション内のデータを書き込むために開始された書き込みリクエストは失敗します。トランザクションがコミットまたは中止された場合、またはトランザクションがタイムアウトした場合、ローカル トランザクション内のデータはロック解除されます。

    • ローカル トランザクション ID を持つ読み取りまたは書き込みリクエストが拒否された場合でも、ローカル トランザクションは有効なままです。再試行ルールを指定してリクエストを再送信するか、トランザクションを中止することができます。

パラメーター

パラメーター

必須

説明

tableName

はい

データテーブルの名前。

primaryKey

はい

データテーブルの主キー。

  • ローカル トランザクションを作成するときは、パーティションキー値を指定する必要があります。

  • ローカル トランザクション内のデータを読み書きするときは、すべての主キー列の値を指定する必要があります。

transactionId

はい

ローカル トランザクションを一意に識別するローカル トランザクション ID。

ローカル トランザクション内のデータを読み書きするときは、ローカル トランザクション ID を指定する必要があります。

ローカル トランザクションを使用してデータを書き込み、ローカル トランザクションをコミットする

次のサンプルコードは、特定のパーティションキー値に基づいてローカル トランザクションを作成し、ローカル トランザクションにデータを書き込み、ローカル トランザクションをコミットしてローカル トランザクション内のすべてのデータ変更をデータテーブルに適用する方法の例を示しています。

(async () => {
    try {

        // ローカル トランザクションを作成します。
        const response = await client.startLocalTransaction({
            tableName,
            primaryKey: [{  // ローカル トランザクションのパーティションキー値のみを指定する必要があります。
                "id": "partitionKeyValue"
            }]
        });

        // ローカル トランザクション ID を取得します。
        const transactionId = response.transactionId;

        // ローカル トランザクションにデータを書き込みます。
        await client.putRow({
            tableName,
            condition: new TableStore.Condition(TableStore.RowExistenceExpectation.IGNORE, null),
            primaryKey,
            attributeColumns: [{
                col: 'updated'
            }],
            transactionId
        });

        // ローカル トランザクションをコミットします。
        await client.commitTransaction({
            transactionId
        })
    } catch (e) {
        console.error(e)
    }
})();

ローカル トランザクションを使用してデータを書き込み、ローカル トランザクションを中止する

次のサンプルコードは、特定のパーティションキー値に基づいてローカル トランザクションを作成し、ローカル トランザクションにデータを書き込み、ローカル トランザクションを中止してローカル トランザクション内のすべてのデータ変更を破棄する方法の例を示しています。

(async () => {
    try {

        // ローカル トランザクションを作成します。
        const response = await client.startLocalTransaction({
            tableName,
            primaryKey: [{  // ローカル トランザクションのパーティションキー値のみを指定する必要があります。
                "id": "partitionKeyValue"
            }]
        });
        // ローカル トランザクション ID を取得します。
        const transactionId = response.transactionId

        // ローカル トランザクションにデータを書き込みます。
        await client.putRow({
            tableName,
            condition: new TableStore.Condition(TableStore.RowExistenceExpectation.IGNORE, null),
            primaryKey,
            attributeColumns: [{
                col: 'updated'
            }],
            transactionId
        });
        // ローカル トランザクションを中止します。
        await client.abortTransaction({
            transactionId
    })
  } catch (e) {
    console.error(e)
  }
})();

参照

複数の行のデータを同時に書き込む場合、または主キー値が特定の範囲内にあるデータを読み取る場合は、ローカル トランザクションを作成します。次に、データを書き込む または データを読み取る トピックで提供されているサンプルコードを参照して、ローカル トランザクション ID を含むリクエストを開始します。