Oracle自治事务

自治事务是Oracle中解决在事务处理中记录日志等特殊需求的一种机制。它与主事务独立,其提交或回滚不会受主事务影响。自治事务可以在主事务中插入不可回滚的日志,且主事务能看到其提交的数据,但不能访问自治事务持有的资源,否则可能引发死锁。
摘要由CSDN通过智能技术生成

自治事务

自治事务要解决的问题

一个动机是:为了解决事务处理过程中记录日志的问题。
假设在事务处理过程中,在日志表中插入了一些日志信息,当事务需要回滚时,插入的日志会被一起回滚,但如果需要保留这些日志,该怎么办?所以引入了自治事务的概念。

自治事务的特点

  1. 自治事务和主事务完全独立。
    这意味着:
    • 自治事务所做的提交,不会受主事务回滚的影响(不会因主事务的回滚而回滚)。
    • 自治事务执行提交语句,主事务不会被提交。
    • 自治事务执行回滚语句,主事务不会被回滚。
    • 自治事务所做的回滚,不受主事务提交的影响。(这是句废话,就算是正常的子过程执行了回滚,主事务执行提交也找不回来子过程所做的DML)
  2. 自治事务提交后,主事务可以看到自治事务提交的数据。
  3. 自治事务执行时,并不能看到主事务尚未提交的数据。
  4. 退出使用自治事务的过程时,如果既没有提交也没有回滚,会导致异常。

还有可能会死锁。

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(*)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值