ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired

ORA-00054 是 Oracle 数据库中的一个常见错误,表示 资源正忙。通常发生在试图对某个数据库对象(如表、索引)执行 DDL 操作(如修改表结构、删除表)或加锁操作时,该对象已被其他会话(Session)锁定且未释放。

 

错误原因

  1. 对象被其他会话锁定

    • 例如:其他用户正在修改表结构(ALTER TABLE)或执行 DML(INSERT/UPDATE/DELETE)未提交。

    • 并行操作(如并行 DML)可能隐式持有锁,导致冲突。

  2. 事务未提交/回滚

    • 当前会话执行了 DML 操作但未提交,导致后续 DDL 操作无法获取排他锁。

  3. 死锁或长时间未释放锁

    • 高并发场景下,多个会话竞争同一资源。

    网络断开、程序异常退出也会导致锁表

 解决方法

 

1. 提交或回滚当前事务

如果错误由当前会话未提交的事务引起,直接提交或回滚

COMMIT;  -- 提交事务
ROLLBACK; -- 回滚事务

 2. 查找并终止阻塞会话

 通过以下步骤定位持有锁的会话并终止

 

查询锁信息

SELECT 
    s.sid, 
    s.serial#,
    s.username,
    s.machine,
    l.type,
    o.object_name,
    l.block
FROM 
    v$locked_object l
JOIN 
    dba_objects o ON l.object_id = o.object_id
JOIN 
    v$session s ON l.session_id = s.sid
WHERE 
    o.object_name = 'YOUR_TABLE_NAME';  -- 替换为实际表名

 终止阻塞会话

 ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE;  -- 替换为查询结果中的 sid 和 serial#

 

3. 调整 DDL 操作时机

如果错误发生在 DDL 操作(如 ALTER TABLE)中:

  • 等待其他会话释放锁:稍后重试操作。

  • 使用 WAIT 或 NOWAIT 选项(Oracle 11g+):

 ALTER TABLE your_table DROP COLUMN column_name WAIT 60;  -- 等待 60 秒

 4. 检查并行操作冲突

 

并行 DML(如并行 INSERT/UPDATE/DELETE)可能导致锁争用:

  • 减少并行度:降低 PARALLEL 提示中的并行值。

  • 提交事务:确保并行操作后立即提交:

 

BEGIN
  INSERT /*+ PARALLEL(emp, 4) */ INTO emp SELECT * FROM src_emp;
  COMMIT;  -- 立即提交释放锁
END;
/

5. 监控锁状态

使用动态性能视图实时监控锁:

 SELECT * FROM v$lock;
SELECT * FROM v$session WHERE sid IN (SELECT sid FROM v$lock);

 

预防措施

  1. 优化事务设计

    • 避免长事务,及时提交或回滚。

    • 在 DDL 操作前确保无活动事务。

  2. 减少锁争用

    • 避免高峰时段执行 DDL。

    • 使用 NOWAIT 选项明确锁行为。

  3. 监控工具

    • 使用 Oracle Enterprise Manager (OEM) 或脚本定期检查锁状态。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

愿与狸花过一生

盛时常作衰时想 上场当念下场时

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

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

打赏作者

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

抵扣说明:

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

余额充值