还有如何解锁? 请给出具体的SQL语句

解决方案 »

  1.   


    1. 诊断系统中的锁select /*+ NO_MERGE(a) NO_MERGE(b) NO_MERGE(c) */ 'Wait' "Status", a.username, a.machine, a.sid, a.serial#, a.last_call_et "Seconds", b.id1, c.sql_text "SQL"
    from v$session a, v$lock b, v$sqltext c
    where a.username is not null
    and a.lockwait = b.kaddr
    and c.hash_value =a.sql_hash_value
    union
    select /*+ NO_MERGE(a) NO_MERGE(b) NO_MERGE(c) */ 'Lock' "Status", a.username, a.machine, a.sid, a.serial#, a.last_call_et "Seconds", b.id1, c.sql_text "SQL"
    from v$session a, v$lock b, v$sqltext c
    where b.id1 in
    (select /*+ NO_MERGE(d) NO_MERGE(e) */ distinct e.id1
    from v$session d, v$lock e
    where d.lockwait = e.kaddr)
    and a.username is not null
    and a.sid = b.sid
    and b.request=0
    and c.hash_value =a.sql_hash_value;
    Status有两种状态,LOCK表明该进程锁住了某个资源,WAIT表示该进程正在等待某个资源。
    Username, Machine分别为ORACLE用户名及机器名
    SID,SERIAL#可用于随后的解锁操作
    Seconds表示该进程最后一次进行操作至当前的时间(秒)
    ID1, 锁标识。某个LOCK状态的ID1与某个WAIT状态的ID1相同,可说明锁的正是另一个进程等待的。
    SQL: 锁住资源的SQL语句2. 解除锁诊断出锁的状态后,若发现该阻塞其它用户进程的进程是正常操作中,则可通知该用户对其进行提交,从而达到释放锁资源的目的;若为非正常操作,即,其状态为"inactive",且其Seconds已为较多长时间,则可执行以下语句将该进程进行清除,系统会自动对其进行回滚,从而释放锁住的资源。 
    alter system kill session 'sid, serial#'; 
      

  2.   

    to ruyuezhang(ruyue) 能否不通过杀死进程进行解锁?比如 直接对锁定的对象进行解锁
      

  3.   

    commit   或 ROLLBACK
      

  4.   

    转贴:
    1.用户锁,数据库的锁有的时候是比较耗费资源的,特别是发生锁等待的时候,我们必须找到发生等待的锁,有可能的话,杀掉该进程。 
    这个语句将查找到数据库中所有的DML语句产生的锁,还可以发现,任何DML语句其实产生了两个锁,一个是表锁,一个是行锁。 
    可以通过alter system kill session ‘sid,serial#’来杀掉会话   SELECT /*+ rule */ 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,dba_objects o  WHERE l.sid = s.sid  AND l.id1 = o.object_id(+)  AND s.username is NOT NULL  2.锁与等待,如果发生了锁等待,我们可能更想知道是谁锁了表而引起谁的等待 
    以下的语句可以查询到谁锁了表,而谁在等待。   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  
    以上查询结果是一个树状结构,如果有子节点,则表示有等待发生。如果想知道锁用了哪个回滚段,还可以关联到V$rollname,其中xidusn就是回滚段的USN 3.如果发生了事务或锁,想知道哪些回滚段正在被使用吗?其实通过事务表,我们可以详细的查询到事务与回滚段之间的关系。同时,如果关联会话表,我们则可以知道是哪个会话发动了这个事务。   SELECT s.USERNAME,s.SID,s.SERIAL#,t.UBAFIL "UBA filenum",  t.UBABLK "UBA Block number",t.USED_UBLK "Number os undo Blocks Used",  t.START_TIME,t.STATUS,t.START_SCNB,t.XIDUSN RollID,r.NAME RollName  FROM v$session s,v$transaction t,v$rollname r  WHERE s.SADDR=t.SES_ADDR  AND t.XIDUSN=r.usn