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

Tablestore:ローカルトランザクション機能の使用

最終更新日:May 08, 2025

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

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

前提条件

  • クライアントが初期化されていること。詳細については、「Tablestore クライアントの初期化」をご参照ください。

  • ローカルトランザクション機能が有効になっているデータテーブルが作成されていること。

    説明

    データテーブルの作成時にローカルトランザクション機能を有効にしておらず、データテーブルの作成後にローカルトランザクション機能を使用する場合は、チケットを送信してください。

手順

  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 を指定する必要があります。

サンプルコード

ローカルトランザクション機能を使用してデータ行を書き込む

次のサンプルコードは、テーブル内の指定されたパーティションキー値に基づいてローカルトランザクションを作成する方法と、ローカルトランザクションにデータ行を書き込む方法を示しています。

private static void transactionPutRow(SyncClient client) {
    // データテーブルの名前を指定します。
    String tableName="<TABLE_NAME>";
    // 指定されたパーティションキー値に基づいてローカルトランザクションを作成します。
    PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    // パーティションキーの列名、データ型、および列値を指定します。
    primaryKeyBuilder.addPrimaryKeyColumn("pk1", PrimaryKeyValue.fromString("pkvalue"));
    PrimaryKey primaryKey = primaryKeyBuilder.build();
    // ローカルトランザクションを作成するためのリクエストを構築します。
    StartLocalTransactionRequest request = new StartLocalTransactionRequest(tableName, primaryKey);
    // ローカルトランザクションを作成するためのリクエストを開始し、ローカルトランザクション ID を取得します。
    String txnId = client.startLocalTransaction(request).getTransactionID();
    
    // ローカルトランザクションにデータ行を書き込みます。
    // 行のプライマリキー情報を構成します。
    PrimaryKeyBuilder primaryKeyBuilder1 = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    // プライマリキーの列名、データ型、および列値を指定します。テーブルのプライマリキーが複数のプライマリキー列で構成されている場合は、プライマリキー列に関する情報を順番に構成します。
    primaryKeyBuilder1.addPrimaryKeyColumn("pk1", PrimaryKeyValue.fromString("pkvalue"));
    primaryKeyBuilder1.addPrimaryKeyColumn("pk2", PrimaryKeyValue.fromLong(10001));
    PrimaryKey primaryKey1 = primaryKeyBuilder1.build();
    // 行の属性列を構成します。
    RowPutChange rowPutChange = new RowPutChange(tableName, primaryKey1);
    // 各属性列の列名、データ型、および列値を指定します。必要に応じて、さらに属性列を追加します。
    rowPutChange.addColumn(new Column("col1", ColumnValue.fromString("colvalue")));
    rowPutChange.addColumn(new Column("col2", ColumnValue.fromLong(10)));
    PutRowRequest request1 = new PutRowRequest(rowPutChange);
    // リクエストにローカルトランザクション ID を渡します。
    request1.setTransactionId(txnId);
    client.putRow(request1);
    
    // ローカルトランザクションをコミットまたは中止します。
    // ローカルトランザクションをコミットして、ローカルトランザクション内のすべてのデータ変更を有効にします。
    CommitTransactionRequest commitRequest = new CommitTransactionRequest(txnId);
    client.commitTransaction(commitRequest);
    // ローカルトランザクションを中止して、ローカルトランザクション内のすべてのデータ変更を無効にします。
    //AbortTransactionRequest abortRequest = new AbortTransactionRequest(txnId);
    //client.abortTransaction(abortRequest);
}

ローカルトランザクション機能を使用してデータ行を読み取る

次のサンプルコードは、テーブル内の指定されたパーティションキー値に基づいてローカルトランザクションを作成する方法と、ローカルトランザクションでデータ行を読み取る方法を示しています。

private static void transactionGetRow(SyncClient client) {
    // データテーブルの名前を指定します。
    String tableName="exampletabled";
    // 指定されたパーティションキー値に基づいてローカルトランザクションを作成します。
    PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    // パーティションキーの列名、データ型、および列値を指定します。
    primaryKeyBuilder.addPrimaryKeyColumn("pk1", PrimaryKeyValue.fromString("111"));
    PrimaryKey primaryKey = primaryKeyBuilder.build();
    // ローカルトランザクションを作成するためのリクエストを構築します。
    StartLocalTransactionRequest request = new StartLocalTransactionRequest(tableName, primaryKey);
    // ローカルトランザクションを作成するためのリクエストを開始し、ローカルトランザクション ID を取得します。
    String txnId = client.startLocalTransaction(request).getTransactionID();

    // ローカルトランザクションでデータ行を読み取ります。
    // 行のプライマリキー情報を構成します。
    PrimaryKeyBuilder primaryKeyBuilder1 = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    // プライマリキーの列名、データ型、および列値を指定します。テーブルのプライマリキーが複数のプライマリキー列で構成されている場合は、プライマリキー列に関する情報を順番に構成します。
    primaryKeyBuilder1.addPrimaryKeyColumn("pk1", PrimaryKeyValue.fromString("111"));
    primaryKeyBuilder1.addPrimaryKeyColumn("pk2", PrimaryKeyValue.fromLong(10001));
    PrimaryKey primaryKey1 = primaryKeyBuilder1.build();
    SingleRowQueryCriteria criteria = new SingleRowQueryCriteria(tableName, primaryKey1);
    // 最新バージョンのデータを読み取ります。
    criteria.setMaxVersions(1);
    GetRowRequest request1 = new GetRowRequest(criteria);
    // リクエストにローカルトランザクション ID を渡します。
    request1.setTransactionId(txnId);
    GetRowResponse getRowResponse = client.getRow(request1);
  
    // ローカルトランザクションをコミットまたは中止します。読み取り操作の場合、ローカルトランザクションのコミットと中止の効果は同じです。
    // ローカルトランザクションをコミットして、ローカルトランザクション内のすべてのデータ変更を有効にします。
    CommitTransactionRequest commitRequest = new CommitTransactionRequest(txnId);
    client.commitTransaction(commitRequest);
    // ローカルトランザクションを中止して、ローカルトランザクション内のすべてのデータ変更を無効にします。
    //AbortTransactionRequest abortRequest = new AbortTransactionRequest(txnId);
    //client.abortTransaction(abortRequest);
    
    // データ行を取得して表示します。
    Row row = getRowResponse.getRow();
    System.out.println("データ行が読み取られ、次のように表示されます。");
    System.out.println(row);
}

関連情報

複数のデータ行を一度に書き込んだり、パーティションキー値が指定された範囲内にあるデータを読み取ったりする場合は、ローカルトランザクションを作成します。次に、「データの書き込み」または「データの読み取り」トピックに記載されているサンプルコードを参照して、リクエストにローカルトランザクション ID を含めてリクエストを開始します。