oracle触发器阻塞,优化触发器导致会话阻塞

数据库: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/,如需转载,请注明出处,否则将追究法律责任。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值