データテーブルのローカル トランザクション機能を有効にすると、指定されたパーティションキー値に基づいてローカル トランザクションを作成し、ローカル トランザクション内のデータに対して読み取りおよび書き込み操作を実行できます。ローカル トランザクション機能を使用して、1 つ以上の行を読み書きするアトミック操作を実行できます。
ローカル トランザクションを使用して、同じパーティションキーを共有するデータに対する操作がすべて成功するか、すべて失敗するかを指定できます。ローカル トランザクションの分離レベルは Read Committed です。
前提条件
OTSClient インスタンスが初期化されています。詳細については、OTSClient インスタンスを初期化する を参照してください。
データテーブルが作成され、データがデータテーブルに書き込まれます。詳細については、データテーブルを作成する および データを書き込む を参照してください。
ローカル トランザクション機能を使用する
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 を含むリクエストを開始します。