帮忙分析下,下面的触发器,是否存在死锁!
写法一:
create trigger  tr_test 
after update of a1 on A
begin 
  update B set B.a1 where ...
end; create trigger  tr_test 
after update of a1 on B
begin 
  update B set B.a2 where ...
end;写法二:
create trigger  tr_test 
after update of a1 on A
begin 
  update B set B.a1 where ...
  update B set B.a1 where ... 
end;create trigger  tr_test 
after update of a1 on B
begin 
  update B set B.a2 where ...
end;

解决方案 »

  1.   

    这样写呢,我感觉你写那俩都可能锁,个人观点
    create trigger  tr_test 
    after update of a1 on A 
    begin 
      update B set B.a1 where ... 
      update B set B.a2 where ... 
    end; 
      

  2.   


    谢谢!你这样写的确是对的!但是实际的情况不是这样的!
    问题是这样的
    create trigger  tr_test 
    after update of a1 on A 
    begin 
      update B set B.a1 where ... 
    end; 我只写了这个触发器!
    但是我发现我在更新A表的a1的时候,跟新成功!

    select
        (select username from v$session where sid=a.sid) blocker,
        a.sid, 'is blocking',
        (select username from v$session where sid=b.sid) blockee,
        b.sid
        from v$lock a,v$lock b
        where a.block=1 and b.request>0
        and a.id1=b.id1
        and a.id2=b.id2
    查询的结果里面有B表!
    但是用在10g的em下面看,有个语句update b set b.b2='' where ...处于等待的状态!
    但是B表我查了没有其他的触发器!
      

  3.   

    个人认为写成:
    create trigger  tr_test 
    before update of a1 on A 
    begin 
      update B set B.a1 where ... 
    end; create trigger  tr_test 
    before update of a1 on B 
    begin 
      update B set B.a2 where ... 
    end;
      

  4.   

    楼上说的对。另外 ,楼主可以查是哪个session被锁啊