避免在Oracle UPDATE命令中进行锁定

时间:2011-10-11 13:16:51

标签: oracle oracle10g locking

如果我尝试在Oracle 10g中获取锁定(例如,使用SELECT...FOR UPDATE),则有一个NOWAIT选项可在行被锁定时获取错误,而不是仅挂起的查询。有没有办法在简单的UPDATE语句中实现此目的?在Oracle 11g中有一个DDL_LOCK_TIMEOUT选项,我需要类似的DML操作(以及10g)。

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

1 个答案:

答案 0 :(得分:4)

没有。如果某个其他会话锁定了它尝试更新的行,则无法在Oracle中使用简单的UPDATE语句超时。当然,您可以在执行更新之前对单元测试进行编码以执行SELECT ... FOR UPDATE WAIT <<n>>。这将确保到达UPDATE时,您将确保已经锁定。

我也有点担心你要对其他会话同时修改的行运行单元测试。这似乎打败了进行单元测试的目的,因为测试失败是因为代码做错了或者是因为其他一些会话在测试期间以意想不到的方式修改了数据,因此无法确定。