一个数据库事务包含一条或者多条 DML 语句,事务有明确的起始点及结束点。
开启事务
以 MySQL 模式为例,数据库在执行以下语句时会开启一个事务。
begin
start transaction
insert ...
update ...
delete ...
select ... for update...
当事务开启时,OceanBase 数据库为事务分配一个事务 ID,用于唯一的标识一个事务。通过 oceanbase.__all_virtual_trans_stat 可以查询事务的状态。以下例子说明,update 语句开启了一个事务。
session 1:
obclient> SET autocommit=0;
Query OK, 0 rows affected (0.00 sec)
obclient> UPDATE t SET c="b" WHERE i=1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
session 2:
obclient> SELECT trans_id FROM __all_virtual_trans_stat;
+-----------------------------------------------------------------------------------------+
| trans_id |
+-----------------------------------------------------------------------------------------+
| {hash:17242042390259891950, inc:98713, addr:"xxx.xxx.xxx.xxx:24974", t:1632636623536459} |
+-----------------------------------------------------------------------------------------+
语句执行
在语句执行过程中,OceanBase 数据库在语句访问到的每个分区上创建一个事务上下文,用于记录语句执行过程中的数据快照版本号以及语句对该分区所做的修改。
结束事务
事务结束时收集事务执行过程中修改过的所有分区,根据不同的场景对这些分区发起提交事务或者回滚事务。以下场景会触发事务的提交或者回滚。
用户显式的发起 Commit 或者 Rollback。用户发起 Commit 时,OceanBase 数据库会将事务所做的修改持久化到 clog 文件中。
用户执行 DDL 操作。包括 CREATE、DROP、RENAME、或者 ALTER。当用户在事务中发起这些 DDL 操作,OceanBase 数据库会隐式的发起一个 Commit 请求,后续的语句会开启一个新的事务。
客户端断开连接。当客户端在事务执行过程中断开连接,OceanBase 数据库会隐式的发起 Rollback 请求,将事务回滚。
一个事务结束之后,后续的请求会开启一个新的事务。以下例子说明,UPDATE 语句开启了一个事务,ROLLBACK 语句结束事务。后续的 UPDATE 语句又开启了一个新的事务。
session 1:
obclient> SET autocommit=0;
Query OK, 0 rows affected (0.00 sec)
obclient> UPDATE t SET c="b" WHERE i=1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
session 2:
obclient> SELECT trans_id FROM __all_virtual_trans_stat;
+-----------------------------------------------------------------------------------------+
| trans_id |
+-----------------------------------------------------------------------------------------+
| {hash:17242042390259891950, inc:98713, addr:"xxx.xxx.xxx.xxx:24974", t:1632636623536459} |
+-----------------------------------------------------------------------------------------+
session 1:
obclient> ROLLBACK;
Query OK, 0 rows affected
obclient> UPDATE t SET c="c" WHERE i=1;
Query OK, 1 row affected
Rows matched: 1 Changed: 1 Warnings: 0
session 2:
obclient> SELECT trans_id FROM __all_virtual_trans_stat;
+------------------------------------------------------------------------------------------+
| trans_id |
+------------------------------------------------------------------------------------------+
| {hash:11752179762787656100, inc:104885, addr:"xxx.xxx.xxx.xxx:24974", t:1632636737417119} |
+------------------------------------------------------------------------------------------+
1 row in set「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




