来自Oracle的文档: -
ORA-00054 resource busy and acquire with NOWAIT specified
Cause: Resource interested is busy.
Action: Retry if necessary.
在我们的代码中,我们发出SELECT FOR UPDATE NOWAIT
命令来锁定我们即将更新的行。
现在的逻辑是,如果它返回SQL错误54
,则假定另一个用户正在尝试更新同一记录。这个逻辑有效吗?
从Oracle的文档中看起来更像是如果数据库不堪重负,那么这也可能导致抛出此错误。
当我们仅使用上述SQL命令时,出现此错误的可能原因是什么?
答案 0 :(得分:2)
SELECT ... FOR UPDATE尝试获取表上的RS(行共享)锁和行上的X(eXclusive)锁。如果另一个会话对表具有独占锁(例如,创建索引)或对行执行独占锁(更新,删除或选择更新),则查询将等待另一个事务释放锁(提交或回滚)通常)除非你指定了NOWAIT。
所以有一种可能性就是不指定NOWAIT。
我不认识数据库由于“不堪重负”而可能引发此错误的情况。