优化触发器导致会话阻塞

数据库:ORACLE DATABASE 10.2.0.4
操作系统: WIN7 64位旗舰版
1、准备测试数据
create table lixia.t1 (id nunmber);
create table lixia.t1_log (id number);


insert into lixia.t1 select 1 from daul;


insert into lixia.t1 select 2 from daul; 


insert into lixia.t1 select 3 from daul;


insert into lixia.t1_log select 1 from daul;


2、创建触发器,当对LIXIA.T1表UPDATE时触发该触发器
create or replace trigger lixia.test after update
on lixia.t1 for each row
begin
  if updating then
    insert into lixia.t1_log
    (id)
select  :old.id as oldf1
    from dual;
  end if;
  delete lixia.t1_log where id=1;  
  ---commit;
end;






3、SESSION 149执行UPDATE
SQL> update lixia.t1 set id=3 where id=30;


已更新 1 行。


SQL> select sid from v$mystat where rownum=1;


       SID
----------
       149
       
3、SESSION 151执行UPDATE被阻塞的
SQL> update lixia.t1 set id=20 where id=2;






SQL> select event,sql_id,sid,BLOCKING_SESSION from v$session where event='enq: TX - row lock contention'
EVENT                          SQL_ID                            SID BLOCKING_SESSION
------------------------------ -------------------------- ---------- ----------------
enq: TX - row lock contention  4rt0bmtrmp50p                     151              149




4、SESSION 149提交事务
SQL> commit;


提交完成。


5、SESSION 151更新成功


SQL> update lixia.t1 set id=20 where id=2;


已更新 1 行。


6、下面在SESSION 151不提交的情况下,在SESSION 149上执行一次更新,更新成功,因为LIXIA.T1_LOG用已经没有id=1的行了,
   之前SESSION 149和SESSION 151虽然在 T1表上是更新不同的行,但执行触发器时在T1_LOG上是DELETE相同的数据行,导致了
   阻塞。
SQL> update lixia.t1 set id=30 where id=3;


已更新 1 行。


7、优化方法
删除触发器的delete lixia.t1_log where id=1 ,这样就不会因为执行触发器导致阻塞了。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/21582653/viewspace-1430208/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/21582653/viewspace-1430208/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值