ORA-00054 错误仅在显式使用 NOWAIT 或 DDL 被锁时触发,非普通 DML 等待超时;.NET 中常见于 ORM 拼写 FOR UPDATE NOWAIT、仓储层未处理重试或存储过程含 DDL 且 ddl_lock_timeout=0;安全重试须限次(3–5 次)、退避(起始 100ms)、避免忙等,并仅适用于 SELECT...FOR UPDATE NOWAIT 类操作。

ORA-00054 不是锁没释放,而是你代码主动拒绝等待
普通 UPDATE 或 DELETE 语句默认会等锁释放,根本不会抛 ORA-00054。这个错误只在你明确用了 NOWAIT(比如 SELECT ... FOR UPDATE NOWAIT),或执行 DDL(如 DROP TABLE、ALTER TABLE)时被其他事务锁住表才触发。.NET 应用里常见于:ORM 手动拼了 FOR UPDATE NOWAIT;仓储层封装了悲观锁逻辑但没处理重试;或者调用存储过程内部含 DDL 且启用了 ddl_lock_timeout=0。
捕获 ORA-00054 后怎么安全重试?
不能无脑循环重试——可能掩盖长事务、死锁或设计缺陷。重试前必须确认:是不是真要等,还是该换路径。
- 仅对
SELECT ... FOR UPDATE NOWAIT类操作做重试,DDL 操作不建议重试(应提前协调或改用在线重定义) - 重试间隔建议从 100ms 起步,最多 3–5 次,避免雪崩式重试压垮数据库
- 每次重试前加
Thread.Sleep或用Task.Delay,别用忙等 - 记录原始异常的
OracleException.Number和Message,方便区分真ORA-00054和误报(比如网络中断被错判)
示例(C#):
v$lock











