データベーストランザクションは1つまたは複数のDMLステートメントで構成され、明確な開始点と終了点を持ちます。
トランザクションの開始
MySQLモードを例にすると、データベースは以下のステートメントを実行する際にトランザクションを開始します。
begin
start transaction
insert ...
update ...
delete ...
select ... for update...
トランザクションが開始されると、OceanBaseデータベースはトランザクションに一意の識別子であるトランザクションIDを割り当てます。oceanbase.__all_virtual_trans_stat を使用してトランザクションの状態を確認できます。以下の例は、update ステートメントがトランザクションを開始したことを示しています。
session 1:
obclient> SET autocommit=0;
Query OK, 0 rows affected (0.00 sec)
obclient> UPDATE t SET c="b" WHERE i=1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
session 2:
obclient> SELECT trans_id FROM __all_virtual_trans_stat;
+-----------------------------------------------------------------------------------------+
| trans_id |
+-----------------------------------------------------------------------------------------+
| {hash:17242042390259891950, inc:98713, addr:"xx.xx.xx.xx:24974", t:1632636623536459} |
+-----------------------------------------------------------------------------------------+
ステートメントの実行
ステートメントの実行中、OceanBaseデータベースは、ステートメントがアクセスする各パーティションに対してトランザクションコンテキストを作成します。これは、ステートメントの実行過程におけるデータスナップショットのバージョン番号およびそのパーティションに対するステートメントによる変更を記録するために使用されます。
トランザクションの終了
トランザクション終了時には、トランザクション実行中に変更されたすべてのパーティションを収集し、異なるシナリオに応じてこれらのパーティションに対してトランザクションのコミット(COMMIT)またはロールバック(ROLLBACK)を実行します。以下のシナリオでは、トランザクションのコミットまたはロールバックがトリガーされます。
ユーザーが明示的にコミットまたはロールバックを実行する場合。ユーザーがコミットを実行すると、OceanBaseデータベースはトランザクションによる変更をclogファイルに永続化します。
ユーザーがDDL操作を実行する場合。CREATE、DROP、RENAME、ALTERを含みます。ユーザーがトランザクション内でこれらのDDL操作を実行すると、OceanBaseデータベースは暗黙的にコミットリクエストを送信し、後続のステートメントは新しいトランザクションを開始します。
クライアントが接続を切断した場合。クライアントがトランザクション実行中に接続を切断すると、OceanBaseデータベースは暗黙的にロールバックリクエストを送信し、トランザクションをロールバックします。
トランザクションが終了すると、後続のリクエストは新しいトランザクションを開始します。以下の例は、UPDATE ステートメントがトランザクションを開始し、ROLLBACK ステートメントがトランザクションを終了することを示しています。その後の UPDATE ステートメントが新しいトランザクションを開始します。
session 1:
obclient> SET autocommit=0;
Query OK, 0 rows affected (0.00 sec)
obclient> UPDATE t SET c="b" WHERE i=1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
session 2:
obclient> SELECT trans_id FROM __all_virtual_trans_stat;
+-----------------------------------------------------------------------------------------+
| trans_id |
+-----------------------------------------------------------------------------------------+
| {hash:17242042390259891950, inc:98713, addr:"xx.xx.xx.xx:24974", t:1632636623536459} |
+-----------------------------------------------------------------------------------------+
session 1:
obclient> ROLLBACK;
Query OK, 0 rows affected
obclient> UPDATE t SET c="c" WHERE i=1;
Query OK, 1 row affected
Rows matched: 1 Changed: 1 Warnings: 0
session 2:
obclient> SELECT trans_id FROM __all_virtual_trans_stat;
+------------------------------------------------------------------------------------------+
| trans_id |
+------------------------------------------------------------------------------------------+
| {hash:11752179762787656100, inc:104885, addr:"xx.xx.xx.xx:24974", t:1632636737417119} |
+------------------------------------------------------------------------------------------+
1 row in set