【问题标题】:SELECT FOR UPDATE NOWAIT interaction with Update query for Oracle SQLSELECT FOR UPDATE NOWAIT 与 Oracle SQL 的更新查询交互
【发布时间】:2015-07-23 08:40:38
【问题描述】:

我目前在一个表上使用SELECT FOR UPDATE NOWAIT 来防止多个线程执行同一个查询。在执行的同时,另一个线程可能正在对同一张表的某些行运行UPDATE 查询。

这两个查询之间的确切交互是什么? UPDATE 查询会返回异常还是会阻塞直到 SELECT FOR UPDATE NOWAIT 完成?

【问题讨论】:

  • DBMS 是 Oracle 11g。这些行由 UUID 标识。对不起,错误信息!

标签: sql oracle locking


【解决方案1】:

当您使用 SELECT FOR UPDATE NOWAIT 时,任何其他并发选择更新或候选集匹配至少一个相同行的更新将需要等待,直到行级锁被释放或不确定。

如果您使用另一个 select for update 而不是 update,您可以使用 nowait 或 skip locked 子句来修改此默认行为。

【讨论】:

  • 反之亦然?这意味着如果所选行有并发更新,则 select for update 将阻塞?
  • 是的,选择更新将阻止任何并发更新。 update 语句没有“select for update”那样的 nowait 或 skip locked 选项。
  • 抱歉措辞不佳。我的意思是如果它在更新行的中间(更新查询首先出现),选择更新查询会被阻止还是在访问正在更新的行时抛出异常?
  • 选择更新将被阻止。您可以使用 nowait 但选择将立即结束而不会引发任何异常。如果您改用“跳过锁定”,您将只锁定一部分行。
  • 谢谢,我必须找到解决该问题的方法,因为我需要使用“nowait”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-07
相关资源
最近更新 更多