データベーストランザクションは、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)を実行します。以下のシナリオでは、トランザクションのコミットまたはロールバックがトリガーされます。
ユーザーが明示的にCommitまたはRollbackを実行する場合。ユーザーがCommitを実行すると、OceanBaseデータベースはトランザクションによる変更をclogファイルに永続化します。
ユーザーがDDL操作を実行する場合。CREATE、DROP、RENAME、またはALTERを含みます。ユーザーがトランザクション内でこれらのDDL操作を実行すると、OceanBaseデータベースは暗黙的にCommitリクエストを送信し、後続のステートメントは新しいトランザクションを開始します。
クライアントが接続を切断する場合。クライアントがトランザクションの実行中に接続を切断すると、OceanBaseデータベースは暗黙的にRollbackリクエストを送信し、トランザクションをロールバックします。
トランザクションが終了すると、後続のリクエストは新しいトランザクションを開始します。以下の例は、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