データベースのトランザクションは、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