YashanDB 事务管理
YashanDB 事务由一条或多条 SQL 语句(DML 或 DDL)以及一条特殊的 SET TRANSACTION 语句组成。
事务可以分为如下两类:
一条或多条 DML 语句的组合,一起构成对数据库的原子修改
一条 DDL 语句
以从账户 A 给账户 B 转账 100 元的操作为例,该操作包含以下步骤:
减少 A 账户的余额
增加 B 账户的余额
在事务日志中记录转账操作
正常情况下,这 3 个步骤都正常完成,事务提交,全部修改生效。
若操作过程中发生了故障,例如余额不足、账户冻结、营业厅断电等情况,事务将无法完整完成,则必须全部回滚。回滚后,所有的账户余额维持原状。
该操作对应的事务示例如下:
事务状态
事务启动后直至结束,期间事务始终处于活跃状态。
活跃状态的事务可以接受新的修改,但需提交后才真正生效。在事务活跃期间,以下内容会产生缓存更改:
数据缓冲区页面修改
undo 日志
redo 日志
有数据更改的行被锁定
查询事务活跃状态的示例如下:
事务控制
#事务启动
YashanDB 事务是隐式启动的,由第一条可执行的 SQL 语句触发启动。
事务启动时,YashanDB 会为其分配运行期间所需的资源,包括事务运行需要的内存、锁区、UNDO 等,同时会为其分配一个全局唯一的事务 ID。
事务启动后,可以通过 V$TRASACTION 视图查到事务相关信息。
#事务结束
YashanDB 事务可以通过手动和自动方式来结束,通常包含以下方式:
手动执行 COMMIT 事务提交,事务更改将永久生效。
手动执行 ROLLBACK 且不指定 TO SAVEPOINT,整个事务将回滚。
运行一个 DDL,例如 CREATE TABLE 等操作,YashanDB 的事务会在 DDL 运行前触发自动提交。自动提交后,DDL 会作为一个新的事务运行。
用户通过断开连接、logout 等方式退出连接。退出连接时,根据该驱动或客户端工具的指令设置,事务会被自动提交或回滚。通常,正常退出时事务触发提交,异常退出时事务触发回滚。
如上述示例,提交一个事务后,(1,2,3)这条数据将持久化至该表内,事务修改生效。
#事务控制语句
事务控制语句可用于管理事务的行为,包括以下语句:
COMMIT 语句:
用于提交当前事务,使事务所有的修改都持久化并生效。提交事务后,将归还事务所占用的所有资源,包括 SAVEPOINT、锁资源、内存资源、UNDO。
ROLLBACK 语句:
ROLLBACK:用于回滚当前事务,使事务所有的修改被回退,丢弃更改。
ROLLBACK TO SAVEPOINT:只将事务数据和资源回退至 SAVEPOINT 处的状态,而不会结束整个事务。
SAVEPOINT:
用于标识一个保存点,记录了当前的事务状态和资源持有情况,后续事务可以回滚到已标记的保存点。
以下是事务控制语句的使用示例:

SAVEPOINT
当在未结束事务中设置保存点后,后续发生的任何操作,都可以通过 ROLLBACK TO SAVEPOINT 而撤销,数据和资源都将恢复到 SAVEPOINT 时的状态。
YashanDB 在 ROLLBACK TO SAVEPOINT 时会做以下操作:
回滚 SAVEPOINT 后的所有语句。
释放指定 SAVEPOINT 后所有的其他 SAVEPOINT。
释放指定 SAVEPOINT 后的所有表锁和行锁资源。
在指定 SAVEPOINT 前的数据和锁都不受影响,事务仍处于活跃状态,可以继续执行事务操作。
以下是一个使用 SAVEPOINT 的示例,若先执行 ROLLBACK TO A,则 A 后面才记录的 SAVEPOINT B 将会自动释放:
自治事务
自治事务时一种独立事务,可以在主事务中嵌套使用。YashanDB 允许用户使用自治事务,可以在其中执行 SQL 操作,并独立结束自治事务。结束自治事务后,可以继续操作主事务。
自治事务一般用于必须独立执行的、不需要关注调用它的主事务最终如何结束的操作。自治事务具有以下特点:
自治事务对主事务中的未提交修改不可见,也不会与主事务共享锁或资源。
自治事务提交后,其他事务即可以对其修改可见,而不需要等待主事务提交。
自治事务内可以启动自治事务,允许多层嵌套。
在 PL 中,自治事务在发起后,可以自由使用一组 SQL 语句执行数据修改。在自治事务的范围内,资源独立于其父事务执行。
示例如下,详细用法可以查看PL参考手册中相关语法。
版权声明: 本文为 InfoQ 作者【YashanDB】的原创文章。
原文链接:【http://xie.infoq.cn/article/5045b92d7e42ff2610b09cf40】。文章转载请联系作者。
评论