Oracle 查询谁锁住了表(ORA-00054: 资源正忙)

本文介绍在Oracle数据库中遇到的锁表场景及如何处理。当更新语句因资源繁忙而失败时,可使用特定查询找出锁住表的会话,并通过kill命令终止该会话。文中提供详细SQL脚本及Oracle官方文档链接。

1 场景

想更新一条语句时,弹出了报错:ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源, 或者超时失效,此时,就可以看看,是哪位小伙伴把你要更新的表锁住了。

2 示例

2.1 锁表场景

-- 锁表的场景,如:
select * from scott.dept for update;
select * from scott.emp for update;
select * from scott.salgrade s where s.grade = 1 for update;

2.2 查询锁表情况

SELECT sess.sid,
       sess.serial#,
       ao.owner           AS 属主,
       ao.object_id       AS 对象id,
       ao.object_name     AS 对象名,
       ao.object_type     AS 对象类型,
       ao.last_ddl_time   AS 最后一次ddl变更日期,
       ao.status          AS 状态,
       lo.os_user_name    AS 电脑域账户,
       lo.oracle_username AS 登录用户,
       lo.locked_mode     AS 锁模式, -- 3:Row Exclusive Table Lock
       sess.status        AS 状态,
       sess.logon_time    AS 最后一次登录日期,
       sess.machine       AS 机器名,
       sess.terminal      AS 终端名,
       sess.program       AS 程序名,
       sess.port          AS 端口号
  FROM v$locked_object lo, -- object_id
       dba_objects     ao, -- owner, object_name 
       v$session       sess -- sid
 WHERE ao.object_id = lo.object_id
   AND sess.sid = lo.session_id
 ORDER BY sess.logon_time DESC;

2.3 kill 会话

-- 其中 sid 和 serial# 来源上述查询
ALTER system kill session 'sid, serial#';
-- 如:sid = 159,serial# = 22643
ALTER system kill session '159, 22643';

3 扩展

3.1 Oracle 官方文档

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鱼丸丶粗面

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值