声明“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”如何工作?的主要内容,如果未能解决你的问题,请参考以下文章