データテーブルのローカル トランザクション機能を有効にすると、指定されたパーティションキー値に基づいてローカル トランザクションを作成し、ローカル トランザクション内のデータに対して読み取りおよび書き込み操作を実行できます。ローカル トランザクション機能を使用して、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 を持つ読み取りまたは書き込みリクエストが拒否された場合でも、ローカル トランザクションは有効なままです。再試行ルールを指定してリクエストを再送信するか、トランザクションを中止できます。
API 操作
このセクションでは、ローカル トランザクション機能に関連する次の API 操作について説明します。startLocalTransaction、commitTransaction、および abortTransaction。
startLocalTransaction
/**
* ローカル トランザクションを作成し、ローカル トランザクション ID を取得します。
* @api
* @param [] $request
* リクエスト パラメータ。テーブル名とパーティションキーを含みます。
* @return [] レスポンス。
* @throws OTSClientException パラメータエラーが発生した場合、または Tablestore サーバーが検証エラーを返した場合に返される例外。
* @throws OTSServerException Tablestore サーバーがエラーを返した場合に返される例外。
* @example "src/examples/StartLocalTransaction.php" 50
*/
public function startLocalTransaction(array $request)
commitTransaction
/**
* ローカル トランザクションをコミットします。
* @api
*
* @param [] $request
* リクエスト パラメータ。トランザクション ID です。
* @return [] レスポンス。
* @throws OTSClientException パラメータエラーが発生した場合、または Tablestore サーバーが検証エラーを返した場合に返される例外。
* @throws OTSServerException Tablestore サーバーがエラーを返した場合に返される例外。
* @example "src/examples/CommitTransaction.php" 50
*/
public function commitTransaction(array $request)
abortTransaction
/**
* ローカル トランザクションを中止します。
* @api
*
* @param [] $request
* リクエスト パラメータ。トランザクション ID です。
* @return [] レスポンス。
* @throws OTSClientException パラメータエラーが発生した場合、または Tablestore サーバーが検証エラーを返した場合に返される例外。
* @throws OTSServerException Tablestore サーバーがエラーを返した場合に返される例外。
* @example "src/examples/AbortTransaction.php" 20
*/
public function abortTransaction(array $request)
パラメータ
パラメータ | 説明 |
table_name | データテーブルの名前。 |
key | データテーブルのパーティションキー。 ローカル トランザクションを作成するときは、パーティションキー値を指定する必要があります。 |
primary_key | データテーブルの主キー。 ローカル トランザクションでデータを読み書きするときは、すべての主キー列の値を指定する必要があります。 |
transaction_id | ローカル トランザクションを一意に識別するローカル トランザクション ID。 ローカル トランザクションでデータを読み書きするときは、ローカル トランザクション ID を指定する必要があります。 |
例
ローカル トランザクション機能を使用してデータ行を書き込む
この例では、テーブルの指定されたパーティションキーに対して作成されたローカル トランザクションにデータ行が書き込まれ、ローカル トランザクションがコミットされます。
// ローカル トランザクション ID を取得します。
$response = $client->startLocalTransaction (array (
'table_name' => 'TransactionTable',
// 主キーは [PK0:INTEGER,PK1:STRING] です。
'key' => array(
array('PK0', 123)
)
));
$attr = array();
$attr[] = ['col0', 'bbb'];
$request = [
'table_name' => 'TransactionTable',
'condition' => RowExistenceExpectationConst::CONST_IGNORE, // condition を IGNORE、EXPECT_EXIST、または EXPECT_NOT_EXIST に設定できます。
// 主キーを指定します。
'primary_key' => [
['PK0', 123],
['PK1', 'abc']
],
'attribute_columns' => $attr,
'transaction_id' => $response['transaction_id']
];
// putRow メソッドを実行してデータを書き込みます。
$client->putRow($request);
// トランザクション内のすべてのデータ変更を有効にするために、トランザクションをコミットします。ローカル トランザクションを破棄して、ローカル トランザクション内のすべてのデータ変更を無効にすることもできます。
$client->commitTransaction(array(
'transaction_id' => $response['transaction_id']
));
// ローカル トランザクションを中止して、トランザクション内のすべてのデータ変更を無効にします。
// $client->abortTransaction(array(
// 'transaction_id' => $response['transaction_id']
// ));
ローカル トランザクション機能を使用してデータ行を読み取る
この例では、テーブルの指定されたパーティションキーに対して作成されたローカル トランザクションでデータ行が読み取られます。
// ローカル トランザクション ID を取得します。
$response = $client->startLocalTransaction (array (
'table_name' => 'TransactionTable',
// 主キーは [PK0:INTEGER,PK1:STRING] です。
'key' => array(
array('PK0', 123)
)
));
$request = array(
'table_name' => 'TransactionTable',
// 主キーを指定します。
'primary_key' => array (
array('PK0', 123),
array('PK1', 'abc')
),
'max_versions' => 1,
'columns_to_get' => ['col0'],
'transaction_id' => $response['transaction_id']
);
// getRow メソッドを実行してデータを読み取ります。
$client->getRow($request);
// ローカル トランザクションをコミットまたは中止します。ローカル トランザクションをコミットまたは破棄したときの読み取り操作への影響は同じです。
// トランザクション内のすべてのデータ変更を有効にするために、トランザクションをコミットします。
$client->commitTransaction(array(// トランザクションをコミットします。
'transaction_id' => $response['transaction_id']
));
// ローカル トランザクションを中止して、トランザクション内のすべてのデータ変更を無効にします。
// $client->abortTransaction(array(
// 'transaction_id' => $response['transaction_id']
// ));
参照
複数のデータ行を同時に書き込む場合、または主キー値が特定の範囲内にあるデータを読み取る場合は、ローカル トランザクションを作成します。次に、データの書き込み または データの読み取り トピックで提供されているサンプルコードを参照して、ローカル トランザクション ID を含むリクエストを開始します。