本記事では、OceanBaseデータベースで一般的に使用されるトランザクション開始ステートメントとその例を紹介します。
トランザクションの開始
OceanBaseデータベースのOracleモードにおけるトランザクション制御文は、Oracleデータベースと互換性があります。OceanBaseデータベースのOracleモードでは、以下の方法でトランザクションを開始することができます:
BEGINコマンドを実行するobclient [SYS]> BEGIN; // トランザクションの開始 obclient [SYS]> INSERT INTO table1 VALUES(1,1); obclient [SYS]> COMMIT;START TRANSACTIONコマンドを実行するobclient [SYS]> START TRANSACTION; // トランザクションの開始 obclient [SYS]> INSERT INTO table1 VALUES(1,1); obclient [SYS]> COMMIT;注意
BEGINはSTART TRANSACTIONのエイリアスであり、トランザクションを開始するために使用されます。autocommit = 0を設定して(自動コミットをオフにする)、INSERT、UPDATE、DELETE、SELECT FOR UPDATEステートメントを実行すると、システムは新しいトランザクションを開始します。obclient [SYS]> SET AUTOCOMMIT=0; obclient [SYS]> INSERT INTO table1 VALUES(1,1); // トランザクションの開始 obclient [SYS]> COMMIT; obclient [SYS]> SET AUTOCOMMIT=0; obclient [SYS]> UPDATE table1 SET id = 2 WHERE id = 1; //トランザクションの開始 obclient [SYS]> COMMIT; obclient [SYS]> SET AUTOCOMMIT=0; obclient [SYS]> DELETE FROM table1 WHERE id = 2; //トランザクションの開始 obclient [SYS]> COMMIT; obclient [SYS]> SET AUTOCOMMIT=0; obclient [SYS]> SELECT id FROM table1 WHERE id = 1 FOR UPDATE; //トランザクションの開始 obclient [SYS]> COMMIT;
トランザクションが開始されると、OceanBaseデータベースはトランザクションにトランザクションIDを割り当て、トランザクションを一意に識別します。
実際の運用において、複数の並行接続が同一のデータテーブルに対する操作を行う際に、2つのトランザクションが同じ行のデータに対する操作を行う可能性があります。クエリの読み取り操作では、SELECT FOR UPDATE ステートメントを使用してクエリ結果をロックすることで、他のDMLステートメントが該当レコードを同時に変更することを防ぐことができます。SELECT FOR UPDATE ステートメントの詳細な使用方法については、クエリ結果のロックSELECT FOR UPDATEを参照してください。
以下の例では、まず SET autocommit=0 で自動コミット機能をオフにし、次に UPDATE ステートメントを実行してトランザクションを開始します。
obclient [SYS]> CREATE TABLE ordr(
id NUMBER NOT NULL PRIMARY KEY,
name VARCHAR2(10) NOT NULL,
value NUMBER,
gmt_create DATE NOT NULL DEFAULT sysdate );
Query OK, 0 rows affected
obclient [SYS]> INSERT INTO ordr(id, name, value)
VALUES (1,'CN',10001),(2,'US', 10002),(3,'EN', 10003);
Query OK, 3 rows affected
Records: 3 Duplicates: 0 Warnings: 0
obclient [SYS]> SELECT * FROM ordr;
+----+------+-------+---------------------+
| id | name | value | gmt_create |
+----+------+-------+---------------------+
| 1 | CN | 10001 | 2022-10-19 14:51:12 |
| 2 | US | 10002 | 2022-10-19 14:51:12 |
| 3 | EN | 10003 | 2022-10-19 14:51:12 |
+----+------+-------+---------------------+
2 rows in set
obclient [SYS]> SET autocommit=0;
Query OK, 0 rows affected
obclient [SYS]> UPDATE ordr SET id=4 WHERE name='US';
Query OK, 1 row affected
Rows matched: 1 Changed: 1 Warnings: 0
アクティブなトランザクションの参加者情報は、ビュー V$OB_TRANSACTION_PARTICIPANTS で確認できます。
obclient [SYS]> SELECT * FROM V$OB_TRANSACTION_PARTICIPANTS;
*************************** 1. row ***************************
TENANT_ID: 1004
SVR_IP: XX.XX.XX.223
SVR_PORT: 2882
SESSION_ID: 3221487658
SCHEDULER_ADDR: "XX.XX.XX.223:2882"
TX_TYPE: UNDECIDED
TX_ID: 77130
LS_ID: 1001
PARTICIPANTS: NULL
CTX_CREATE_TIME: 02-NOV-22 02.58.12.850332 PM
TX_EXPIRED_TIME: 03-NOV-22 02.58.12.850332 PM
STATE: ACTIVE
ACTION: START
PENDING_LOG_SIZE: 48
FLUSHED_LOG_SIZE: 0
ROLE: LEADER
1 row in set
ビュー V$OB_TRANSACTION_PARTICIPANTS のフィールドと詳細な説明については、V$OB_TRANSACTION_PARTICIPANTSを参照してください。