自治事务
自治事务要解决的问题
一个动机是:为了解决事务处理过程中记录日志的问题。
假设在事务处理过程中,在日志表中插入了一些日志信息,当事务需要回滚时,插入的日志会被一起回滚,但如果需要保留这些日志,该怎么办?所以引入了自治事务的概念。
自治事务的特点
- 自治事务和主事务完全独立。
这意味着:- 自治事务所做的提交,不会受主事务回滚的影响(不会因主事务的回滚而回滚)。
- 自治事务执行提交语句,主事务不会被提交。
- 自治事务执行回滚语句,主事务不会被回滚。
- 自治事务所做的回滚,不受主事务提交的影响。(这是句废话,就算是正常的子过程执行了回滚,主事务执行提交也找不回来子过程所做的DML)
- 自治事务提交后,主事务可以看到自治事务提交的数据。
- 自治事务执行时,并不能看到主事务尚未提交的数据。
- 退出使用自治事务的过程时,如果既没有提交也没有回滚,会导致异常。
还有可能会死锁。
If an autonomous transaction attempts to access a resource held by the main transaction (which cannot resume until the autonomous routine exits), a deadlock can occur. Oracle raises an exception in the autonomous transaction, which is rolled back if the exception goes unhandled.
自治事务示例
Create table Msg (Msg varchar(50));
-- 自治事务:
create or replace procedure AutoNomouse_Insert is
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
insert into Msg values('AutoNomouse Insert');
commit;
end;
/
-- test-01
DELETE FROM Msg;
COMMIT;
insert into Msg Values('This Main Info');
/* 主程序事务未提交,插入的数据可以看到 */
SELECT * FROM Msg;
/* 自治事务执行并提交, */
CALL AutoNomouse_Insert();
/* 自治事务插入的数据在主事务中可见。 */
SELECT * FROM Msg;
ROLLBACK;
/* 回滚主事务,自治事务提交的数据不受影响;主事务的数据同样不受自治事务提交的影响。 */
SELECT * FROM Msg;
-- test-02
create or replace procedure AutoNomouse_Insert is
PRAGMA AUTONOMOUS_TRANSACTION;
cnt NUMBER := 0;
BEGIN
SELECT COUNT(*)