金仓数据库KingbaseES自治事务介绍
关键字:
KingbaseES、transaction、自治事务、人大金仓
什么是自治事务?
包含自治事务的匿名块、存储过程和函数称之为自治程序。为便于说明,将调用自治程序的事务称之为主事务。自治事务是独立于主事务的事务,本质上也是事务。它以匿名块、存储过程和函数为载体,自治程序被执行时,它所包含的所有事务就称之为自治事务。
自治事务的特性
1、事务的独立性
主事务和自治事务相互独立,各自的 TCL 操作互不影响,即主、自治事务的 commit和rollback 互不干涉。
例子:示例中存储过程proc1是一个自治存储过程。
情况一:
没有commit操作,只有rollback回滚操作时,除了自治事务中的t0不被回滚以外,t1、t2都被回滚。
执行结果:只插入了t0。
情况二:
在t1后有一个commit操作,有rollback回滚操作时,自治事务中的t0不被回滚且,t1已经被commit操作所以也不会被回滚,但是t2被回滚。
程序执行结果:插入了t0和t1
情况三:
在t1后有一个commit操作,在t2后也有一个commit操作,有rollback回滚操作时,自治事务中的t0不被回滚,t1已经被commit操作所以也不会被回滚, t2也被commit操作所以也不会被回滚回滚。
具体过程:主事务由begin开始,执行t1 语句后被commit提交,开启下一个事务即t2 语句,执行完t2 语句后又被commit提交,然后开启再下一个事务,执行proc1这个存储过程,即执行t0语句,最后遇到rollback回滚事务,但是由于回滚是主事务的所以不会影响到proc1这个自治存储过程,同时由于t1和t2在回滚之前都被commit过了,所以也无法被回滚了。
因此该程序给student表插入了t0、t1、t2三条数据。
程序执行结果:插入了t0、 t1和t3。
2、数据的可见性
a) 主事务或其他事务仅已提交的更改对自治事务可见
b) 自治事务中已提交的更改对主事务和其他事务可见
用 1 中的例子加以说明,主事务的 t1 语句未提交,对于 proc1 不可见,t0 语句已提交, 对 proc1 可见;同理,自治事务的 t2 语句被提交后对主事务可见。
3、数据的关联性
a) 自治程序可接受主事务传递的参数
b) 自治程序可返回结果集
c) 自治事务异常可以被主事务捕获
d) 自治程序的打印等信息可直接被主事务接收,使用透明
e) 自治程序的 OUT 参数对主事务同样生效
自治事务的优势
自治事务是完全独立的。它与主事务不共享锁、资源或提交依赖项。即使主事务回滚,也可以记录事件、增加重置计数器等。
自治事务可帮助构建模块化、可重用的软件组件。
可以将自治事务封装在存储的子程序中。调用应用程序不需要知道由存储的子程序完成的操作是成功还是失败。
自治事务的声明
使用 PRAGMA AUTONOMOUS_TRANSACTION。
注意:为了便于阅读,最好将PRAGMAAUTONOMOUS_TRANSACTION放在声明性部分的顶部。
自治事务示例
- 声明自治PL/SQL块:
在块的声明区首先声明一下这是一个自治块
- 声明自治独立过程:
- 声明自治函数:
在函数的变量声明区使用关键字声明自治函数,然后在主事务中调用该自治函数,验证其不会随着主事务的回滚而回滚,如下图所示:
- 在包中声明自治函数:
将自治函数的声明放到函数的变量声明区域,如下图所示:
- 自治事务的控制:
使用commit和rollback操作控制当前事务
在自治事务中遇到commit则会提交事务内容,执行成功。
如果在在事务中遇到rollback关键字,则是回滚整个事务。