避免Oracle UPDATE命令中的锁定

避免Oracle UPDATE命令中的锁定,oracle,oracle10g,locking,Oracle,Oracle10g,Locking,如果我试图在Oracle 10g中获取锁(例如,使用SELECT…FOR UPDATE),则在锁定行时,会有一个NOWAIT选项来获取错误,而不是仅挂起查询。对于一个简单的UPDATE语句,有没有办法做到这一点?在Oracle11g中有一个选项,我需要类似的DML操作(和10g) (背景:我有一些查询数据库的单元测试(不幸的是,它不是一个独立的测试数据库,而是用于各种事情的开发数据库),我希望它们在出现任何错误时立即抛出错误,而不是挂起。)否。如果其他会话锁定了它试图更新的行,则无法在Oracl

如果我试图在Oracle 10g中获取锁(例如,使用
SELECT…FOR UPDATE
),则在锁定行时,会有一个
NOWAIT
选项来获取错误,而不是仅挂起查询。对于一个简单的
UPDATE
语句,有没有办法做到这一点?在Oracle11g中有一个选项,我需要类似的DML操作(和10g)


(背景:我有一些查询数据库的单元测试(不幸的是,它不是一个独立的测试数据库,而是用于各种事情的开发数据库),我希望它们在出现任何错误时立即抛出错误,而不是挂起。)

否。如果其他会话锁定了它试图更新的行,则无法在Oracle超时中使用简单的UPDATE语句。当然,您可以编写单元测试代码来执行
SELECT。。。进行更新之前,请等待更新
。这将确保在您进行更新时,可以保证您已经拥有了锁


我也有点困惑于这样一种想法:您将针对其他会话同时修改的行运行单元测试。这似乎违背了进行单元测试的目的,因为永远无法确定测试失败是因为代码出错还是因为测试期间其他会话以意外的方式修改了数据。

正如我所说的,可能的重复是不幸的,但我似乎暂时无法接受。抓到ORA-00054并将该测试标记为非决定性,似乎比因为有人在桌子上做一些慢动作而使整个测试过程陷入停顿要好。+1和+2如果可以的话。理想情况下,单元测试应该在单元测试的第一步中创建并在测试结束时删除的行上进行,或者在您知道无法修改的数据上进行。