本記事では、OceanBaseデータベースでよく使用されるトランザクション開始ステートメントとその例について説明します。
トランザクションの開始
OceanBaseデータベースのMySQLモードにおけるトランザクション制御文は、MySQLデータベースと互換性があります。OceanBaseデータベースのMySQLモードでトランザクションを開始するには、以下の方法があります:
BEGINコマンドを実行するobclient [test]> BEGIN; //トランザクションを開始 obclient [test]> INSERT INTO table1 VALUES(1,1); obclient [test]> COMMIT;START TRANSACTIONコマンドを実行するobclient [test]> START TRANSACTION; //トランザクションを開始 obclient [test]> INSERT INTO table1 VALUES(1,1); obclient [test]> COMMIT;autocommit = 0(自動コミットを無効にする)を設定し、INSERT、UPDATE、DELETE、SELECT FOR UPDATEステートメントを実行すると、システムはデフォルトで新しいトランザクションを開始します。obclient [test]> SET AUTOCOMMIT=0; obclient [test]> INSERT INTO table1 VALUES(1,1); //トランザクションを開始 obclient [test]> COMMIT; obclient [test]> SET AUTOCOMMIT=0; obclient [test]> UPDATE table1 SET id = 2 WHERE id = 1; //トランザクションを開始 obclient [test]> COMMIT; obclient [test]> SET AUTOCOMMIT=0; obclient [test]> DELETE FROM table1 WHERE id = 2; //トランザクションを開始 obclient [test]> COMMIT; obclient [test]> SET AUTOCOMMIT=0; obclient [test]> SELECT id FROM table1 WHERE id = 1 FOR UPDATE; //トランザクションを開始 obclient [test]> COMMIT;
トランザクションが開始されると、OceanBaseデータベースはトランザクションに一意のIDを割り当てます。
実際の運用では、複数の接続が同時に同一のデータテーブルを操作する場合、二つのトランザクションが同一行に対して操作を行う可能性があります。読み取り操作については、SELECT FOR UPDATE ステートメントを使用してクエリ結果をロックし、他のDMLステートメントによる同時変更を防ぐことができます。このステートメントの詳細な使用方法については、クエリ結果のロック SELECT FOR UPDATEを参照してください。
以下の例では、SET autocommit=0 で自動コミット機能を無効にした後、UPDATE ステートメントでトランザクションを開始します。
obclient [test]> CREATE TABLE ordr(
id INT NOT NULL PRIMARY KEY,
name VARCHAR(10) NOT NULL,
value INT,
gmt_create DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP );
Query OK, 0 rows affected
obclient [test]> 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 [test]> 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 [test]> SET autocommit=0;
Query OK, 0 rows affected
obclient [test]> UPDATE ordr SET id=4 WHERE name='US';
Query OK, 1 row affected
Rows matched: 1 Changed: 1 Warnings: 0
実行が成功した後、oceanbase.V$OB_TRANSACTION_PARTICIPANTS を使用してアクティブなトランザクションの参加者情報を照会できます。
obclient [test]> SELECT * FROM oceanbase.V$OB_TRANSACTION_PARTICIPANTS;
*************************** 1. row ***************************
TENANT_ID: 1002
SVR_IP: xx.xx.xx.223
SVR_PORT: 2882
SESSION_ID: 3221487660
SCHEDULER_ADDR: "xx.xx.xx.223:2882"
TX_TYPE: UNDECIDED
TX_ID: 110352
LS_ID: 1001
PARTICIPANTS: NULL
CTX_CREATE_TIME: 2022-10-19 14:55:23.763474
TX_EXPIRED_TIME: 2022-10-19 14:55:23.763474
STATE: ACTIVE
ACTION: START
PENDING_LOG_SIZE: 116
FLUSHED_LOG_SIZE: 0
ROLE: LEADER
1 row in set
ビュー oceanbase.V$OB_TRANSACTION_PARTICIPANTS のフィールドと詳細説明については、oceanbase.V$OB_TRANSACTION_PARTICIPANTSを参照してください。