处理ORACLE数据库中的锁

 

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# '
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值