当程序运行时,Oracle9i数据库中有几个表经常被锁死,请问怎样查找原因?怎样解决?

解决方案 »

  1.   

    ORACLE的DML语句一般情况下是行级锁,不会锁表。看看是不是有DML操作
      

  2.   

    对的.oracle下的表的锁定是行级的.除了你的应用程序对表的操作有限定.
    而且oarcle的锁定是:数据写入不阻塞数据读取.你可以查看数据库的动态表:如v$lock等.
      

  3.   

    SQL> desc v$locked_object
     Name                                                        Null?    Type
     ----------------------------------------------------------- -------- --------------------------
     XIDUSN                                                               NUMBER
     XIDSLOT                                                              NUMBER
     XIDSQN                                                               NUMBER
     OBJECT_ID                                                            NUMBER
     SESSION_ID                                                           NUMBER
     ORACLE_USERNAME                                                      VARCHAR2(30)
     OS_USER_NAME                                                         VARCHAR2(30)
     PROCESS                                                              VARCHAR2(12)
     LOCKED_MODE                                                          NUMBERSQL> select * from  v$locked_object;查询信息看lock原因吧
      

  4.   

    能查询到是哪个SQL语句导致表锁定的吗?
      

  5.   

    SELECT /*+ rule */ lpad(' ',decode(l.xidusn ,0,3,0))||l.oracle_username User_name, 
    o.owner,o.object_name,o.object_type,s.sid,s.serial# 
    FROM v$locked_object l,dba_objects o,v$session s 
    WHERE l.object_id=o.object_id 
    AND l.session_id=s.sid 
    ORDER BY o.object_id,xidusn DESC 查询被那个所了
      

  6.   

    可以通过alter system kill session ‘sid,serial#’来杀掉会话 
      

  7.   

    v$locked_object中只能看到那个进程(session_id)被锁定了 ,然后在视图SYS.DBA_DML_LOCKS中根据进程id(session_id)来查询是那个表锁定了,所有者是谁等,具体是由那个语句导致的,得由你自己去查询