[20140802] 自治事务与死锁.txt

[20140802] 自治事务与死锁.txt

--今天一上班就遇到用户报机器慢的问题,连过去看,实际上是弹出一个错误窗口.

$  grep -B1 "ORA-00060: Deadlock detected. More info in file" alert_xxxx.log  | egrep '2014' | cut -c1-10 | uniq -c

      1 Fri Jan  3
      .......
      1 Mon Jul 21
      1 Tue Jul 22
     61 Wed Jul 23
    248 Thu Jul 24
    306 Fri Jul 25
     86 Sat Jul 26
    108 Sun Jul 27
    246 Mon Jul 28
    130 Tue Jul 29
    117 Wed Jul 30
    149 Thu Jul 31
    204 Fri Aug  1
     30 Sat Aug  2

--很明显问题大量出现在7月23号,但是用户为什么很少电话来反应问题呢?查看跟踪对应跟踪文件,很容易确定是由于触发器里面使用了
--自治事务而导致自锁的情况。

--实际上以前我也遇到过,再次根据这个问题写一个例子。
http://blog.itpub.net/267265/viewspace-721262/

SCOTT@test> @ver

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production

create table tt (id number not null,status varchar2(1),name varchar2(10));
create unique index i_tt_id on tt(id);

create or replace trigger tri_tt_status
  before insert or update on tt
  for each row
declare
  pragma autonomous_transaction;
begin
    if :new.status = '1' then
        :new.name :='y' ;
    else
        :new.name :='n' ;
    end if ;
    update tt set name=:new.name where id=:new.id;
    commit;
end tri_tt_status;
/

SCOTT@test> insert into tt (id,status) values (1,'0');
1 row created.

SCOTT@test> commit ;
Commit complete.

--插入没有问题,因为记录还不存在。一旦修改。

SCOTT@test> select * from tt;
        ID S NAME
---------- - --------------------
         1 0 n

SCOTT@test> update tt set status='1' where id=1;
update tt set status='y' where id=1
       *
ERROR at line 1:
ORA-00060: deadlock detected while waiting for resource
ORA-06512: at "SCOTT.TRI_TT_STATUS", line 9
ORA-04088: error during execution of trigger 'SCOTT.TRI_TT_STATUS'

SCOTT@test> rollback ;
Rollback complete.

SCOTT@test> select * from tt;
        ID S NAME
---------- - --------------------
         1 0 n

--删除修改以及commit语句。真不知道开发如何测试的,测试没有,真可怕!也许仅仅测试了插入,没有测试修改。

create or replace trigger tri_tt_status
  before insert or update on tt
  for each row
declare
--  pragma autonomous_transaction;
begin
    if :new.status = '1' then
        :new.name :='y' ;
    else
        :new.name :='n' ;
    end if ;
--  update tt set name=:new.name where id=:new.id;
--    commit;
end tri_tt_status;
/

SCOTT@test> update tt set status='1' where id=1;
1 row updated.

SCOTT@test> select * from tt;
        ID S NAME
---------- - --------------------
         1 1 y

SCOTT@test> commit ;
Commit complete.

--插入看看,没有问题。

SCOTT@test> insert into tt (id,status) values (2,'1');
1 row created.

SCOTT@test> select * from tt;
        ID S NAME
---------- - --------------------
         2 1 y
         1 1 y

时间: 2024-09-30 16:29:49

[20140802] 自治事务与死锁.txt的相关文章

[20120421] 自治事务(AUTONOMOUS_TRANSACTION) 与临时表.txt

[20120421] 自治事务(AUTONOMOUS_TRANSACTION) 与临时表.txt 前一阵遇到一个死锁的问题,存储过程使用了自治事务,测试以下使用临时表的问题. 1.测试环境:SQL> select * from v$version ;BANNER--------------------------------------------------------------------------------Oracle Database 11g Enterprise Edition

[20120412]自治事务(AUTONOMOUS_TRANSACTION)与deadlock问题.txt

[20120412]自治事务(AUTONOMOUS_TRANSACTION)与deadlock问题.txt 生产系统rac遇到一个问题,在alert*.log:Sat Mar 17 11:43:31 2012Global Enqueue Services Deadlock detected. More info in file /u01/app/oracle/admin/orcl/udump/orcl2_ora_18076.trc.Sat Mar 17 11:43:31 2012Trace du

oracle数据库自治事务的学习笔记

oracle自治事务是指的存储过程和函数可以自己处理内部事务不受外部事务的影响,用pragma autonomous_transaction来声明.要创建一个自治事务,必须在匿名块的最高层或者存储过程.函数.数据包或触发器的定义部分中,使用PL/SQL中的PRAGMA AUTONOMOUS_TRANSACTION语句. 以下是使用自治事务的几种情况: (1)Declaring Autonomous Function in Package CREATE OR REPLACE PACKAGE emp

AUTONOMOUS TRANSACTION(自治事务)的介绍

    在基于低版本的ORACLE做一些项目的过程中,有时会遇到一些头疼的问题.,比如想在执行当前一个由多个DML组成的transaction(事务)时,为每一步DML记录一些信息到跟踪表中,由于事务的原子性,这些跟踪信息的提交将决定于主事务的commit或rollback. 这样一来写程序的难度就增大了, 程序员不得不把这些跟踪信息记录到类似数组的结构中,然后在主事务结束后把它们存入跟踪表.哎,真是麻烦! 有没有一个简单的方法解决类似问题呢? ORACLE8i的AUTONOMOUS TRANS

Oracle中利用自治事务实现审计功能

在一个事务(外层事务)中可以定义一个或几个自治事务.自治事务可以独立commit,不 对外层事务产生影响,同样外层事务的 rollback 也对自治事务没有影响. 假设现在 有这样一个需求,不能对某个表进行某些操作(如更新),一旦有这类操作,就强制整个回 滚,并且在审计日志中记录该次违规操作.现在的问题是当事务回滚之后,日志中的记录也 会跟着被回滚,这时就可以利用自治事务来防止这个问题. 首先,定义日志表,用于 审计. create table error_logs( id number(10)

Oracle中怎样用自治事务保存日志表

数据库事务是一种单元操作,要么是全部操作都成功,要么全部失败.在Oracle中,一个事务是从执行第一个数据治理语言(DML)语句开始,直到执行一个COMMIT语句,提交保存这个事务,或者执行一个ROLLBACK语句,放弃此次操作结束. 事务的"要么全部完成,要么什么都没完成"的本性会使将错误信息记入数据库表中变得很困难,因为当事务失败重新运行时,用来编写日志条目的INSERT语句还未完成. 针对这种困境,Oracle提供了一种便捷的方法,即自治事务.自治事务从当前事务开始,在其自身的语

PostgreSQL Oracle兼容性之 - plpgsql 自治事务(autonomous_transaction)补丁

PostgreSQL Oracle兼容性之 - plpgsql 自治事务(autonomous_transaction)补丁 作者 digoal 日期 2016-11-04 标签 PostgreSQL , autonomous_transaction , 自治事务 , Oracle兼容性 , plpgsql 背景 PostgreSQL的plpgsql服务端编程语言与Oracle数据库的pl/sql编程语言非常类似,但是对于自治事务一直没有语法层面的支持. 以往如果要支持自治事务,可以使用exce

PostgreSQL Oracle兼容性之 - 函数 自治事务 的实现

使用Oracle的用户,在函数中如果使用了自治事务的话,如果要转到PostgreSQL会遇到很棘手的问题.因为PostgreSQL的函数是作为一个事务来处理的,要么全部提交,要么全部回滚,除了exception,每个exception是一个子事务.因此使用exception可以达到自治事务的目的.例子1,使用并行block和嵌套block,来控制子事务层级.输入参数为block1, block2.1, block2.2, block3.1 .这些参数代表执行在哪个block出错,出错时对应层级的

PostgreSQL 10.0 preview 功能增强 - 匿名、自治事务(Oracle 兼容性)

标签 PostgreSQL , 10.0 , 匿名事务 , 自治事务 背景 PostgreSQL 10.0 通过session backendground实现了匿名事务,从此可以愉快的支持Oracle存储过程的自治事务了. 此前,我们需要通过dblink实现,或者通过匿名块+exception来实现,比较繁琐. <PostgreSQL Oracle 兼容性之 - plpgsql 自治事务(autonomous_transaction)补丁> <PostgreSQL Oracle 兼容性之