声明“for update”如何工作?

Posted

技术标签:

【中文标题】声明“for update”如何工作?【英文标题】:How does statement, 'for update' works? 【发布时间】:2016-05-17 11:45:59 【问题描述】:

如果我听起来很菜鸟,我很抱歉。我正在查看存储过程的代码,我遇到了:

select 
  ...
into 
  ....
from
  ....
where
  ....
for update;

我不明白for update; 的目的是什么。 我确实了解正常更新,类似于:http://www.mkyong.com/oracle/oracle-stored-procedure-update-example/。但无法理解for update; 及其用途。

我环顾四周,但找不到明确的解释。

【问题讨论】:

【参考方案1】:

来自document:

SELECT FOR UPDATE 语句允许您将记录锁定在 游标结果集。您无需更改记录 为了使用这个语句。当记录锁被释放时 发出下一个提交或回滚语句。

另请参阅Oracle docs,上面写着:

FOR UPDATE 子句允许您锁定选定的行,以便其他 在您结束事务之前,用户无法锁定或更新行。 您只能在*** SELECT 语句中指定此子句,而不是 在子查询中。

所以目的很明确,当您想在事务期间锁定行以使其不能被其他事务使用时使用它。

您也可以参考:FOR UPDATE Clause in a SELECT Statement 了解我们如何使用它。

【讨论】:

现在很清楚了。谢谢你。我找不到for update 的那些参考资料。可能,我在谷歌上搜索错了。 @DarcliGht:- 不客气!附带说明:始终尝试从原始 Oracle 文档中查找文档,它将始终帮助您朝着正确的方向前进。 :) 看起来他们的示例是该链接中的损坏图像。想解释一下相关的参考资料吗? 我也很好奇这与其他 rdbms 中的操作有何不同,我希望通过多表连接锁定查询以确保一致性。是什么让 Oracle 的 FOR UPDATE 在竞争中脱颖而出? 甲骨文是个乐观主义者。仅仅因为存在多表连接并不意味着这些表必须被锁定。事实上,这可能会导致巨大的并发问题,尤其是在大型数据库中。在 Oracle 中,没有“for update”的查询是完全非阻塞的。 mysql / InnoDB 和许多其他人也是如此。

以上是关于声明“for update”如何工作?的主要内容,如果未能解决你的问题,请参考以下文章

这些声明中的逗号分隔符在 C++ 中如何工作? [关闭]

函数声明的返回类型中的 & 符号如何工作? [复制]

(声明(缩进*))是如何工作的?

如何在 Excel VBA 中声明全局变量在工作簿中可见

Keycloak 中的协议映射器如何工作?

如何将 Storybook 打字稿元声明转换为 MDX?