ORA-00054 是 Oracle 数据库中的一个常见错误,表示 资源正忙。通常发生在试图对某个数据库对象(如表、索引)执行 DDL 操作(如修改表结构、删除表)或加锁操作时,该对象已被其他会话(Session)锁定且未释放。
错误原因
-
对象被其他会话锁定
-
例如:其他用户正在修改表结构(ALTER TABLE)或执行 DML(INSERT/UPDATE/DELETE)未提交。
-
并行操作(如并行 DML)可能隐式持有锁,导致冲突。
-
-
事务未提交/回滚
-
当前会话执行了 DML 操作但未提交,导致后续 DDL 操作无法获取排他锁。
-
-
死锁或长时间未释放锁
-
高并发场景下,多个会话竞争同一资源。
-
网络断开、程序异常退出也会导致锁表
解决方法
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
提示中的并行值。 -
提交事务:确保并行操作后立即提交:
BEGININSERT /*+ 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);
预防措施
-
优化事务设计
-
避免长事务,及时提交或回滚。
-
在 DDL 操作前确保无活动事务。
-
-
减少锁争用
-
避免高峰时段执行 DDL。
-
使用
NOWAIT
选项明确锁行为。
-
-
监控工具
-
使用 Oracle Enterprise Manager (OEM) 或脚本定期检查锁状态。
-