ORA-00054:resource busy and acquire with nowait

本文介绍了一套实用的方法来处理Oracle数据库中的锁问题。包括如何找出被锁定的表、获取锁定会话的信息、杀死锁定进程及清除锁等步骤。此外,还提供了SQL查询帮助读者理解锁定的session状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 先查看哪些表被锁住了。
select b.owner,
       b.object_name,
       a.session_id,
       a.locked_mode from v$locked_object a,
       dba_objects b where b.object_id = a.object_id;

2. 获取sid,serial
select b.username, b.sid, b.serial#, logon_time
  from v$locked_object a, v$session b
 where a.session_id = b.sid
 order by b.logon_time;

3. 杀死锁进程
alter system kill session 'sid, serial';
如果有ora-00031错误,则在后面加immediate;
很多情况下没法直接杀死session, 需要到数据库服务器杀服务器进程。
通过下面sql查服务器进程
SELECT a.username, c.spid AS os_process_id, c.pid AS oracle_process_id
FROM v$session a, v$process c
 WHERE c.addr = a.paddr
   and a.sid ='250'
   and a.serial# ='14558';

到这里锁应该就被清除了。

——————————————————————————————————————————————————————————————————
查找锁定的session
SELECT   sn.username,m.SID,sn.SERIAL#, m.TYPE,  
        DECODE (m.lmode,  
                0, 'None',  
                1, 'Null',  
                2, 'Row Share',  
                3, 'Row Excl.',  
                4, 'Share',  
                5, 'S/Row Excl.',  
                6, 'Exclusive',  
                lmode, LTRIM (TO_CHAR (lmode, '990'))  
               ) lmode,  
        DECODE (m.request,  
                0, 'None',  
                1, 'Null',  
                2, 'Row Share',  
                3, 'Row Excl.',  
                4, 'Share',  
                5, 'S/Row Excl.',  
                6, 'Exclusive',  
                request, LTRIM (TO_CHAR (m.request, '990'))  
               ) request,  
        m.id1, m.id2  
    FROM v$session sn, v$lock m  
   WHERE (sn.SID = m.SID AND m.request !=0)        --存在锁请求,即被阻塞  
     OR (    sn.SID =m.SID                         --不存在锁请求,但是锁定的对象被其他会话请求锁定  
         AND m.request = 0  
         AND lmode != 4  
         AND (id1, id2) IN (  
                       SELECT s.id1, s.id2  
                         FROM v$lock s  
                        WHERE request != 0 AND s.id1 = m.id1  
                              AND s.id2 = m.id2)  
        )  
ORDER BY id1, id2, m.request;


通过数据字典v$session 与v$lock 来了解正在等待锁资源的用户
select a.username,a.sid,a.serial#,b.id1 from v$session a ,v$lock b   
where a.lockwait = b.kaddr;

了解锁住其他用户的用户进程:
select a.username,a.sid,a.serial#,b.id1 from v$session a,v$lock b   
        where b.id1 in  
                (select distinct e.id1 from v$session d,v$lock e where d.lockwait =e.kaddr)   
                And a.sid = b.sid and b.request =0;

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/21374452/viewspace-2131599/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/21374452/viewspace-2131599/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值