データ テーブルのローカル トランザクション機能を有効にすると、指定されたパーティション キー値に基づいてローカル トランザクションを作成し、ローカル トランザクション内のデータに対して読み取りおよび書き込み操作を実行できます。 ローカル トランザクション機能を使用して、1 つ以上の行を読み書きするアトミック操作を実行できます。
ローカル トランザクションを使用すると、同じパーティション キーを共有するデータに対する操作がすべて成功するか、すべて失敗するかを指定できます。 ローカル トランザクションの分離レベルは Read Committed です。
前提条件
クライアントが初期化されています。 詳細については、「Tablestore クライアントを初期化する」をご参照ください。
ローカル トランザクション機能が有効になっているデータ テーブルが作成されています。
説明データ テーブルを作成する際にローカル トランザクション機能を有効にしておらず、データ テーブルの作成後にローカル トランザクション機能を使用する場合は、チケットを送信します。
ローカル トランザクション機能を使用する
startLocalTransaction を使用して、指定されたパーティション キー値に基づいてローカル トランザクションを作成し、ローカル トランザクションの ID を取得します。
ローカル トランザクション内のデータを読み書きします。
GetRow、PutRow、DeleteRow、UpdateRow、BatchWriteRow、および GetRange 操作を呼び出して、ローカル トランザクション内のデータに対して操作を実行できます。
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 を含むリクエストを開始します。