首批通过分布式安全可靠测评,为关键业务系统打造
开启事务
更新时间:2026-04-06 18:25:48
本文介绍 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,用于唯一的标识一个事务。
在实际使用中,多个并发的连接下,对同一个数据表进行操作时,可能会出现两个事务对同一行数据进行操作。对于查询的读操作,可以通过 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。