暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 批量收集和更新条款

askTom 2017-09-22
244

问题描述

嗨,汤姆,

当我们在游标中使用FOR-UPDATE子句时,我们会锁定我们打算处理的行。
此外,我们使用批量收集来处理大量行以节省时间。

让我们考虑一种情况,即游标正在获取行以进行批量处理。
然后将这些行提取到嵌套表集合中以更新第三个表。

当代码正在进行并且行集被插入到嵌套表中时,源表 (游标所基于的) 中的数据是否可以更改?修改后的数据 (来自随机事务) 是否会在游标中获取?

万一数据确实发生了变化,我们可以防止光标的行集是静态的吗?

谢谢
雅夫尼卡

专家解答

当您开始查询时,结果与该时间点一致。

如果您使用的是游标,则批量收集从中获取,结果与您打开游标的时间一致。

因此,如果您从单个查询/光标填充嵌套表,您将看不到在此开始后所做的任何更改。但是,如果此光标具有 “select... for update”,则一旦打开它,其他任何人都无法更改行!

更新是一个单独的语句。因此,这可以看到在从另一个表中获取行并运行它之间更新的表所做的更改。因此,如果您还没有锁定这些行,这可能会影响您的结果。

当然,如果你所做的只是:

选择 (批量收集) 到嵌套表-> forall使用此嵌套表更新另一个表

显而易见的问题是:

为什么你不能在一个更新语句中完成所有这些?

这避免了选择和更新数据之间的任何读取一致性问题。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论