【问题标题】:How does statement, 'for update' works?声明“for update”如何工作?
【发布时间】: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; 及其用途。

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

【问题讨论】:

    标签: sql oracle stored-procedures


    【解决方案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 和许多其他人也是如此。
    猜你喜欢
    • 2011-05-17
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 2019-04-27
    • 2021-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多