自治事务pragma autonomous_transaction的使用场景(1、程序日志)
PRAGMA在PLSQL里有4个关键词的用法:
(1)autonomous_transaction-自治事务,该程序块的commit或rollback不影响外层事务;
(2)exception_init--错误代码与declare的标识符关联;
(3)restrict_references--程序包的纯度级别;
(4)serially_reusable--程序包级别的数据在引用之间不保留。
到目前为止,我只使用过自治事务一种,在平时的开发经历中,自治事务主要用于2个场景:一是程序日志,二是触发器。先看一下自治事务在日志里的妙用:
在PLSQL程序开发过程中,一般都需要记录一些中间数据或者执行时间等,但是在一个大的事务中间,需要把日志保存下来而不影响整个事务的提交或回退,就只能用自治事务了。一般新实施一个数据库时,我都先把日志程序准备好,以下是实施步骤:
Step1.建一个公用的数据库用户
比如common,pubdata,monitor等,假设是用common用户
Step2.建一个日志表
Step3.记录日志的存储过程(自治事务)
Step4.授权给public用户,使得所有数据库用户都可以使用
刚才在存储过程中已经加了 authid definer(定义者权限),存储过程中涉及的表就不用再授权了。
为了对其他用户更透明,为这个存储过程建个同义词。
Step5.现在可以使用任何数据库用户来调用这个日志程序了
执行的结果如下:
可见
1.日志表对其他用户是不可见的,当然也可以创建全局同义词开放给其他用户
2.在出错前的自治事务记录的日志是保存成功的,
有一点这个程序没有体现,在DO SOMETHING WRONG之前的主程序的事务应该是被回滚的。