在ORACLE9i中,当多个用户同时操作时候,很容易出现死锁。
请问有什么办法可以解决?

解决方案 »

  1.   

    那就在对数据进行改动前尝试手动加锁,如果失败就给予提示这种锁不仅在oracle9i里存在,所有版本都有的 在其中一个会话commit或者rollback之后下一个会话才能进行
    oracle9i中有一种ddl锁,比如当你的程序调用一个包时
    另一个用户试图重新创建(或编译)该包,就可能造成两边都动不了
    这种情况下一般都需要杀掉一个进程,可以用以下的语句查到select /*+ all_rows */ 
          w1.sid waiting_session, 
          h1.sid holding_session, 
          w.kgllktype lock_or_pin, 
          w.kgllkhdl address, d
          ecode(h.kgllkmod, 0, 'None', 1, 'Null', 2, 'Share', 3, 'Exclusive', 'Unknown') mode_held, 
          decode(w.kgllkreq, 0, 'None', 1, 'Null', 2, 'Share', 3, 'Exclusive', 'Unknown') mode_requested 
     from dba_kgllock w, dba_kgllock h, v$session w1, v$session h1 
    where (   (     (h.kgllkmod != 0) 
                and (h.kgllkmod != 1) 
                and (     (h.kgllkreq = 0) 
                       or (h.kgllkreq = 1)
                    )
               ) 
           and (    (    (w.kgllkmod = 0) 
                      or (w.kgllkmod= 1 )
                     ) 
                and (    (w.kgllkreq != 0) 
                     and (w.kgllkreq != 1)
                    )
               )
          ) 
      and w.kgllktype = h.kgllktype 
      and w.kgllkhdl = h.kgllkhdl 
      and w.kgllkuse = w1.saddr 
      and h.kgllkuse = h1.saddr
      

  2.   

    尽量使用完资源,就及时释放。
    commit或者rollback。