暂无图片
暂无图片
2
暂无图片
暂无图片
暂无图片

OceanBase系统架构活跃事务和Savepoint

2024-01-26
270

活跃事务是指事务已经开启,但还没有提交或者回滚的事务。活跃事务所做的修改在提交前都是临时的,别的事务无法看到。 state 字段对应的值所表示的含义如下表所示。

state 的值说明
INIT表示事务处于活跃状态,所有修改对其他事务不可见。
REDO COMPLETE表示事务已经将所有数据成功以日志形式持久化。
PREPARE表示事务已经开始提交,目前处于 PREPARE 状态,读取该事务的修改可能会被卡住(取决于版本号)。
PRECOMMIT表示事务即将提交,正在同步事务的提交版本号到所有涉及的参与者。
COMMIT表示事务已经开始提交,且目前处于 COMMIT状态,其他事务可以看到该事务的修改(取决于版本号)。
ABORT表示事务已经回滚,处于 ABORT 状态,其他事务不能看到该事务的修改。
CLEAR表示事务已经提交或回滚结束,处于 CLEAR 状态。

活跃事务的数据存储相关信息,请参见 多版本读一致性


Savepoint 是 OceanBase 数据库提供的可以由用户定义的一个事务内的执行标记。用户可以通过在事务内定义若干标记并在需要时将事务恢复到指定标记时的状态。

例如,当用户在执行过程中在定义了某个 Savepoint 之后执行了一些错误的操作,用户不需要回滚整个事务再重新执行,而是可以通过执行 ROLLBACK TO 命令来将 Savepoint 之后的修改回滚。

如下表所示的示例,用户可以通过创建 Savepoint sp1 来对之后插入的数据执行回滚。

命令解释
BEGIN;开启事务
INSERT INTO a VALUE(1);插入行 1
SAVEPOINT sp1;创建名为 sp1 的 Savepoint
INSERT INTO a VALUE(2);插入行 2
SAVEPOINT sp2;创建名为 sp2 的 Savepoint
ROLLBACK TO sp1;将修改回滚到 sp1
INSERT INTO a VALUE(3);插入行 3
COMMIT;提交事务

在 OceanBase 数据库的实现中,事务执行过程中的修改都有一个对应的"sql sequence",该值在事务执行过程中是递增的(不考虑并行执行的场景),创建 Savepoint 的操作实际上是将用户创建的 Savepoint 名字对应到事务执行的当前"sql sequence"上,当执行 ROLLBACK TO 命令时,OceanBase 数据库内部会执行以下操作:

  1. 将事务内的所有大于该 Savepoint 对应"sql sequence"的修改全部回滚,并释放对应的行锁,例如示例中的行 2。

  2. 删除该 Savepoint 之后创建的所有 Savepoint,例如示例中的 sp2

ROLLBACK TO 命令执行成功后,事务仍然可以继续操作。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论