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

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

最終更新日:Aug 06, 2026

Tablestore SDK for Java は、指定されたパーティションキー値に対してローカル トランザクションを実行し、トランザクション内のすべての書き込みがコミットされるか、すべて破棄されるかのいずれかであることを保証します。分離レベルはリードコミッティドです。

前提条件

  • Tablestore SDK for Java をインストールし、クライアントを初期化します。

  • テーブルでローカル トランザクションを有効にします。テーブルの作成時にこの機能を有効にできます。既存のテーブルでローカル トランザクションを有効にする場合、または機能が有効になっているかどうかを確認する場合は、チケットを送信

説明

ローカル トランザクションは、単一のパーティションキー値を対象とします。トランザクション内の読み取りと書き込みは、トランザクション ID によって関連付けられ、コミット時にアトミックに適用されます。分離レベルはリードコミッティドです。ローカル トランザクションには、次の 3 つの段階があります。

  1. startLocalTransaction でトランザクションを開始し、トランザクション ID を取得します。

  2. 以降のすべての読み取りまたは書き込みで、setTransactionId(txnId) を使用して ID を関連付けます。

  3. commitTransaction でトランザクションをコミットします。abortTransaction でアボートします。

トランザクション内でサポートされる操作は、GetRowPutRowUpdateRowDeleteRowBatchWriteRow、および GetRange です。

public StartLocalTransactionResponse startLocalTransaction(StartLocalTransactionRequest request) throws TableStoreException, ClientException
public CommitTransactionResponse commitTransaction(CommitTransactionRequest request) throws TableStoreException, ClientException
public AbortTransactionResponse abortTransaction(AbortTransactionRequest request) throws TableStoreException, ClientException

public void setTransactionId(String transactionId)

次の例では、パーティションキー値 pkvalue でローカル トランザクションを開始し、プライマリキー (pkvalue, 10001) を持つ行を書き込み、トランザクションをコミットします。

String tableName = "local_tx_demo";

// 1. 指定したパーティションキー値でローカル トランザクションを開始し、トランザクション ID を取得します。
PrimaryKeyBuilder pkBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
pkBuilder.addPrimaryKeyColumn("pk1", PrimaryKeyValue.fromString("pkvalue"));
PrimaryKey partitionKey = pkBuilder.build();

StartLocalTransactionRequest startRequest =
        new StartLocalTransactionRequest(tableName, partitionKey);
String txnId = client.startLocalTransaction(startRequest).getTransactionID();

// 2. トランザクション内で行を書き込みます。完全なプライマリキーを指定し、トランザクション ID を設定する必要があります。
PrimaryKeyBuilder rowKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
rowKeyBuilder.addPrimaryKeyColumn("pk1", PrimaryKeyValue.fromString("pkvalue"));
rowKeyBuilder.addPrimaryKeyColumn("pk2", PrimaryKeyValue.fromLong(10001));
PrimaryKey rowKey = rowKeyBuilder.build();

RowPutChange rowPutChange = new RowPutChange(tableName, rowKey);
rowPutChange.addColumn(new Column("col1", ColumnValue.fromString("colvalue")));
rowPutChange.addColumn(new Column("col2", ColumnValue.fromLong(10)));

PutRowRequest putRequest = new PutRowRequest(rowPutChange);
putRequest.setTransactionId(txnId);
client.putRow(putRequest);

// 3. トランザクションをコミットして、すべての書き込みを有効にします。変更を破棄するには、代わりに abortTransaction() を呼び出します。
CommitTransactionRequest commitRequest = new CommitTransactionRequest(txnId);
client.commitTransaction(commitRequest);

パラメータ

トランザクション開始リクエスト

StartLocalTransactionRequest には、次のパラメータが含まれます。

名前

タイプ

説明

tableName (必須)

String

データテーブルの名前。

primaryKey (必須)

PrimaryKey

トランザクションの対象範囲を定義するパーティションキー値。ローカル トランザクションを開始する際は、テーブルの最初のプライマリキー列のみを指定します。

rowKeys (オプション)

List<PrimaryKey>

トランザクション開始時にロックする行のプライマリキー。setRowKeys() を呼び出してリストを設定するか、addRowKey() を呼び出してキーを追加します。

トランザクション内のリクエスト

トランザクション内で使用されるデータの読み取りおよび書き込みリクエストは、TxnRequest を継承し、次のパラメータが含まれます。

名前

タイプ

説明

transactionId (必須)

String

startLocalTransaction() によって返されるローカル トランザクション ID。トランザクション内のすべての読み取りまたは書き込みリクエストは、setTransactionId() を呼び出してこの ID を設定する必要があります。

コミットまたはアボートのリクエスト

CommitTransactionRequestAbortTransactionRequest には、次のパラメータが含まれます。

名前

タイプ

説明

transactionID (必須)

String

コミットまたはアボートするローカル トランザクション ID。リクエストを作成する際に ID を指定します。

レスポンス

トランザクション開始の結果

StartLocalTransactionResponse には、次の操作固有のフィールドが含まれます。

名前

タイプ

説明

transactionID

String

新しいローカル トランザクションの ID。getTransactionID() を呼び出して値を取得し、後続のトランザクション内のデータ操作、およびコミットまたはアボートのリクエストで使用します。

制限事項

  • ローカル トランザクションは、自動インクリメントプライマリキー列と併用できません。

  • ローカル トランザクションは、同時実行制御に悲観的ロックを使用します。トランザクション中、パーティションキー値に書き込みロックが保持されるため、トランザクション ID を持つ書き込みリクエストのみが成功します。

  • トランザクションの最大有効期間は 60 秒です。連続する 2 つの操作の間隔が 60 秒を超えると、トランザクションはタイムアウトし、サーバーによって破棄されます。

  • 一度に 1 つのリクエストのみがトランザクション ID を使用できます。同じ ID を共有する同時実行操作はすべて失敗します。

  • トランザクション内のすべての書き込みリクエストは、トランザクションを開始したのと同じパーティションキー値を使用する必要があります。読み取りリクエストにはこのような制限はありません。

  • 1 つのトランザクションで書き込めるデータは最大 4 MB です。

  • トランザクション内の書き込みで列バージョン (タイムスタンプ) を指定しない場合、サーバーはコミット時ではなく、書き込み時にタイムスタンプを生成します。ルールは通常の書き込みと同じです。

  • BatchWriteRow リクエストがトランザクション ID を持つ場合、すべての行はトランザクションが開始されたテーブルを対象とする必要があります。

  • トランザクションに書き込みが含まれていない場合、コミットとアボートは同じ効果になります。

  • トランザクション ID を持つ読み取りまたは書き込みリクエストが失敗しても、トランザクションは終了しません。リトライポリシーを適用するか、明示的にトランザクションをアボートできます。

トランザクション内での行の読み取り

指定したパーティションキー値で読み取り専用トランザクションを作成し、行を読み取ります。

String tableName = "local_tx_demo";

// 1. 指定したパーティションキー値でローカル トランザクションを開始します。
PrimaryKeyBuilder pkBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
pkBuilder.addPrimaryKeyColumn("pk1", PrimaryKeyValue.fromString("pkvalue"));
PrimaryKey partitionKey = pkBuilder.build();

StartLocalTransactionRequest startRequest =
        new StartLocalTransactionRequest(tableName, partitionKey);
String txnId = client.startLocalTransaction(startRequest).getTransactionID();

// 2. トランザクション内で行を読み取ります。完全なプライマリキーを指定し、トランザクション ID を設定する必要があります。
PrimaryKeyBuilder rowKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
rowKeyBuilder.addPrimaryKeyColumn("pk1", PrimaryKeyValue.fromString("pkvalue"));
rowKeyBuilder.addPrimaryKeyColumn("pk2", PrimaryKeyValue.fromLong(10001));
PrimaryKey rowKey = rowKeyBuilder.build();

SingleRowQueryCriteria criteria = new SingleRowQueryCriteria(tableName, rowKey);
criteria.setMaxVersions(1);

GetRowRequest getRequest = new GetRowRequest(criteria);
getRequest.setTransactionId(txnId);
GetRowResponse getResponse = client.getRow(getRequest);

// 3. トランザクションをコミットまたはアボートします。読み取り専用トランザクションの場合、どちらも同じ効果になり、トランザクションを解放します。
CommitTransactionRequest commitRequest = new CommitTransactionRequest(txnId);
client.commitTransaction(commitRequest);

Row row = getResponse.getRow();
System.out.println(row);

トランザクション内での複数行のバッチ書き込み

BatchWriteRowRequest.setTransactionId(txnId) を呼び出して、バッチ書き込みにトランザクション ID を関連付けます。すべての行のパーティションキー値は、トランザクションの開始時に使用された値と一致する必要があり、コミットにより、すべての行がアトミックに適用されます。

String tableName = "local_tx_demo";

// 1. ローカル トランザクションを開始します。バッチ内のすべての行のパーティションキー値は、この値と一致する必要があります。
PrimaryKeyBuilder pkBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
pkBuilder.addPrimaryKeyColumn("pk1", PrimaryKeyValue.fromString("pkvalue"));
PrimaryKey partitionKey = pkBuilder.build();

StartLocalTransactionRequest startRequest =
        new StartLocalTransactionRequest(tableName, partitionKey);
String txnId = client.startLocalTransaction(startRequest).getTransactionID();

// 2. バッチ書き込みリクエストを作成し、トランザクション ID を設定します。
BatchWriteRowRequest batchRequest = new BatchWriteRowRequest();
batchRequest.setTransactionId(txnId);

// 複数の行を追加します (すべての行の pk1 は、トランザクションのパーティションキー値 "pkvalue" と等しい必要があります)。
for (long pk2 = 20001; pk2 <= 20003; pk2++) {
    PrimaryKeyBuilder rowKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    rowKeyBuilder.addPrimaryKeyColumn("pk1", PrimaryKeyValue.fromString("pkvalue"));
    rowKeyBuilder.addPrimaryKeyColumn("pk2", PrimaryKeyValue.fromLong(pk2));
    RowPutChange rowPutChange = new RowPutChange(tableName, rowKeyBuilder.build());
    rowPutChange.addColumn(new Column("col1", ColumnValue.fromString("batch_" + pk2)));
    batchRequest.addRowChange(rowPutChange);
}

BatchWriteRowResponse batchResponse = client.batchWriteRow(batchRequest);
System.out.println("Batch all succeeded: " + batchResponse.isAllSucceed());

// 3. トランザクションをコミットして、すべてのバッチ書き込みをアトミックに適用します。
CommitTransactionRequest commitRequest = new CommitTransactionRequest(txnId);
client.commitTransaction(commitRequest);