数据库: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 ,这样就不会因为执行触发器导致阻塞了。
操作系统: 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/