トランザクションをコミットすると、トランザクションによる変更が永続的に有効になり、セーブポイントがクリアされ、トランザクションが保持しているすべてのロックが解放されます。
トランザクションのコミット
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