トランザクションをコミットすると、トランザクションの変更が永続的に有効になり、セーブポイントがクリアされ、トランザクションが保持しているすべてのロックが解放されます。
トランザクションのコミット
OceanBaseデータベースのOracleモードでは、トランザクションのコミットは明示的に行うことも、暗黙的に行うこともできます。明示的にトランザクションをコミットするには、COMMIT ステートメントを使用するか、送信ボタン(グラフィカルクライアントツール内)を押してトランザクションを終了する必要があります。暗黙的にトランザクションをコミットする場合、ユーザーがコミットする必要はありません。システム変数 autocommit の値が 1 の場合、OceanBaseデータベースは各ステートメントの実行後に、そのステートメントを含むトランザクションを自動的にコミットします。1つのステートメントが1つのトランザクションになります。
説明
OceanBaseデータベースは、DDLステートメントの前後において、暗黙的に COMMIT ステートメントを発行し、トランザクションをコミットします。
BEGINでトランザクションを開始し、DMLステートメントを実行した後は、COMMITでトランザクションをコミットする必要があります。トランザクションをコミットするまで、変更内容は現在のセッションにのみ可視され、他のデータベースセッションには可視されません。変更内容は永続化されていませんので、最終的な結果ではありません。
ROLLBACKステートメントを使用してこれらの変更をロールバックできます。トランザクションをコミットすると、変更内容がすべてのデータベースセッションに可視されます。変更結果は永続化されているため、
ROLLBACKステートメントでこれらの変更をロールバックすることはできません。
説明
トランザクション分離レベルがリピータブルリードに設定されている場合、既にトランザクションを開始したセッションは、新しくコミットされたデータをクエリすることができません。トランザクション分離レベルの詳細については、トランザクション分離レベル を参照してください。
暗黙的にトランザクションが開始されている場合(トランザクションの自動コミットが有効になっている、つまり
autocommitの値が1の場合)、1つのSQLは1つのトランザクションであり、トランザクションをコミットする必要はありません。SQLの実行後、変更は永続的に保存されるため、ROLLBACKステートメントでこれらの変更をロールバックすることはできません。
明示的なトランザクションのコミット例
以下の例では、BEGIN でトランザクションを開始し、その後 INSERT を使用して ordr テーブルにデータを挿入した後、最後に COMMIT ステートメントでコミットします。
obclient [SYS]> SELECT * FROM ordr;
+----+------+-------+------------+
| ID | NAME | VALUE | GMT_CREATE |
+----+------+-------+------------+
| 1 | CN | 10001 | 03-NOV-22 |
| 2 | US | 10002 | 03-NOV-22 |
| 3 | EN | 10003 | 03-NOV-22 |
+----+------+-------+------------+
3 rows in set
obclient [SYS]> BEGIN;
Query OK, 0 rows affected
obclient [SYS]> INSERT INTO ordr(id,name) VALUES(4,'JP');
Query OK, 1 row affected
obclient [SYS]> COMMIT;
Query OK, 0 rows affected
実行が成功した後、セッションを終了して再接続すると、テーブルデータが正しく挿入され、保存されていることが確認できます。
obclient [SYS]> exit;
$obclient -h192.168.0.0 -utpcc@obbmsql#obdemo -P2883 -p******
Welcome to the OceanBase. Commands end with ; or \g.
Your OceanBase connection id is 3221487661
Server version: OceanBase 4.0.0.0 (r100000252022102910-df01cef074936b9c9f177697500fad1dc304056f) (Built Oct 29 2022 10:27:50)
Copyright (c) 2000, 2018, OceanBase and/or its affiliates. All rights reserved.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
obclient [SYS]> SELECT * FROM ordr;
+----+------+-------+------------+
| ID | NAME | VALUE | GMT_CREATE |
+----+------+-------+------------+
| 1 | CN | 10001 | 03-NOV-22 |
| 2 | US | 10002 | 03-NOV-22 |
| 3 | EN | 10003 | 03-NOV-22 |
| 4 | JP | NULL | 03-NOV-22 |
+----+------+-------+------------+
4 rows in set
暗黙的なトランザクションのコミット例
以下の例では、変数 autocommit=1 を設定することで、自動コミットを有効にします。
obclient [SYS]> SELECT * FROM ordr;
+----+------+-------+------------+
| ID | NAME | VALUE | GMT_CREATE |
+----+------+-------+------------+
| 1 | CN | 10001 | 03-NOV-22 |
| 2 | US | 10002 | 03-NOV-22 |
| 3 | EN | 10003 | 03-NOV-22 |
+----+------+-------+------------+
4 rows in set
obclient> SET autocommit=1;
Query OK, 1 row affected
INSERT INTO ordr(id,name) VALUES(4,'JP');
Query OK, 1 row affected
実行が成功した後、セッションを終了して再接続すると、テーブルデータが正しく挿入され、保存されていることが確認できます。
obclient [SYS]> exit;
$obclient -h192.168.0.0 -utpcc@obbmsql#obdemo -P2883 -p******
Welcome to the OceanBase. Commands end with ; or \g.
Your OceanBase connection id is 3221487664
Server version: OceanBase 4.0.0.0 (r100000252022102910-df01cef074936b9c9f177697500fad1dc304056f) (Built Oct 29 2022 10:27:50)
Copyright (c) 2000, 2018, OceanBase and/or its affiliates. All rights reserved.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
obclient [SYS]> SELECT * FROM ordr;
+----+------+-------+------------+
| ID | NAME | VALUE | GMT_CREATE |
+----+------+-------+------------+
| 1 | CN | 10001 | 03-NOV-22 |
| 2 | US | 10002 | 03-NOV-22 |
| 3 | EN | 10003 | 03-NOV-22 |
| 4 | JP | NULL | 03-NOV-22 |
+----+------+-------+------------+
4 rows in set