JSP 操作数据库时有时会锁定一条记录,在PLSQL查询得到锁定哪个表哪行记录,不知道能不能查询得到是哪条语句锁定了这行数据?或者有其它什么更好的法子,去解决这个问题?

解决方案 »

  1.   

    查询那些用户,操纵了那些表造成了锁机 
    SELECT  s.username, 
    decode(l.type,'TM','TABLE LOCK', 
    'TX','ROW LOCK', 
    NULL) LOCK_LEVEL, 
    o.owner,o.object_name,o.object_type, 
    s.sid,s.serial#,s.terminal,s.machine,s.program,s.osuser 
    FROM v$session s,v$lock l,all_objects o 
    WHERE l.sid = s.sid 
    AND l.id1 = o.object_id(+) 
    AND s.username is NOT Null 
      

  2.   

    -- 查出被锁的表,和锁住这个表的会话ID
    select a.session_id ,b.* from v$locked_object a,all_objects b
    where a.object_id=b.object_id-- 查出对应的SQL语句
    select vs.SQL_TEXT,vsess.sid,vsess.SERIAL#,vsess.MACHINE,vsess.OSUSER
    ,vsess.TERMINAL,vsess.PROGRAM,vs.CPU_TIME,vs.DISK_READS
    from v$sql vs,v$session vsess
    where vs.ADDRESS=vsess.SQL_ADDRESS
    and vsess.sid=(上面查出来的会话ID)
      

  3.   

    查询那些用户,操纵了那些表造成了锁机 
    SELECT  s.username, 
    decode(l.type,'TM','TABLE LOCK', 
    'TX','ROW LOCK', 
    NULL) LOCK_LEVEL, 
    o.owner,o.object_name,o.object_type, 
    s.sid,s.serial#,s.terminal,s.machine,s.program,s.osuser 
    FROM v$session s,v$lock l,all_objects o 
    WHERE l.sid = s.sid 
    AND l.id1 = o.object_id(+) 
    AND s.username is NOT Null up
      

  4.   

    1、用2楼方式查找
    2、自己用PLUS SQL工具打开“工具栏”可以看到进程查看的选项,再用点击KILL就可以了。
      

  5.   

    1.查哪个过程被锁查V$DB_OBJECT_CACHE视图:SELECT * FROM V$DB_OBJECT_CACHE WHERE OWNER='过程的所属用户' AND LOCKS!='0';2. 查是哪一个SID,通过SID可知道是哪个SESSION.查V$ACCESS视图:SELECT * FROM V$ACCESS WHERE OWNER='过程的所属用户' AND NAME='刚才查到的过程名';3. 查出SID和SERIAL#查V$SESSION视图:SELECT SID,SERIAL#,PADDR FROM V$SESSION WHERE SID='刚才查到的SID'查V$PROCESS视图:SELECT SPID FROM V$PROCESS WHERE ADDR='刚才查到的PADDR';4. 杀进程(1).先杀ORACLE进程:ALTER SYSTEM KILL SESSION '查出的SID,查出的SERIAL#';(2).再杀操作系统进程:KILL -9 刚才查出的SPID或ORAKILL 刚才查出的SID 刚才查出的SPID
      

  6.   

    哦,补上一点,该操作需要有SYSDBA的权限
      

  7.   

    锁表解除查询:
    select s.sid,
           s.serial#,
           do.object_name,
           l.oracle_username,
           s.machine,
           l.os_user_name,
           l.locked_mode
      from v$locked_object l, dba_objects do, v$session s
     where do.object_id = l.object_id
       and s.sid = l.session_id;接着:
    alter system kill session 'sid,#serial';OK!
      

  8.   

    使用二楼,跟三楼的查询到:
    Update DOL_PROJECT set P_END_DATE=sysdate,P_STATE='1',P_MATERIAL='101000',P_OTHERSTUFF='' where P_ID='1248'这条有什么问题么?以下是执行的代码,能帮分析下不?public void PassDeclare(String strID,String strMaterial,String otherStuff) { // 建立数据库连接类的对象CCDB
    CommConnDataBase objResuInfo = new CommConnDataBase();
    // 设置状态集为空
    String strUp = "Update DOL_PROJECT set P_END_DATE=sysdate,P_STATE='1',P_MATERIAL='"+strMaterial+"',P_OTHERSTUFF='"+otherStuff+"' where P_ID='" + strID + "'";
    System.out.println("审核通过"+strUp);
    try {
    // 更新指定的数据
    objResuInfo.executeSql(strUp);

    } catch (Exception e) {
    System.out.print(e.getMessage());
    } finally {
    // 释放连接对象,交回连接池处理
    objResuInfo.Release();
    }
    }