gpt4 book ai didi

sql - Oracle MERGE 死锁

转载 作者:行者123 更新时间:2023-12-04 02:56:33 28 4
gpt4 key购买 nike

我想以指定的顺序插入带有 MERGE 语句的行以避免死锁。否则可能会发生死锁,因为多个事务将使用重叠的键集调用此语句。请注意,此代码对重复值异常也很敏感,但我通过重试来处理该异常,因此这不是我的问题。我正在做以下事情:

MERGE INTO targetTable
USING (
SELECT ...
FROM sourceCollection
ORDER BY <desiredUpdateOrder>
)
WHEN MATCHED THEN
UPDATE ...
WHEN NOT MATCHED THEN
INSERT ...

现在我仍然遇到死锁,所以我不确定 oracle 是否维护子查询的顺序。在这种情况下,有谁知道如何最好地确保 oracle 以相同的顺序锁定 targetTable 中的行?我必须在合并之前执行 SELECT FOR UPDATE 吗? SELECT FOR UPDATE 以什么顺序锁定行? Oracle UPDATE 语句有一个 ORDER BY 子句,MERGE 似乎缺少该子句。除了每次以相同的顺序锁定行之外,还有其他方法可以避免死锁吗?

[编辑]
此查询用于维护特定操作发生频率的计数。当第一次插入行时发生该操作,第二次发生时,“计数”列增加。有数百万种不同的 Action ,而且它们经常发生。表锁不起作用。

最佳答案

控制修改目标表行的顺序需要您控制 USING 子查询的查询执行计划。这是一项棘手的业务,取决于您的查询可能获得哪种类型的执行计划。

如果您遇到死锁,那么我猜您正在从源集合到目标表获得嵌套循环连接,因为散列连接可能基于散列源集合,并且会大致修改目标表目标表 rowid 顺序,因为这将被完全扫描——在任何情况下,访问顺序在所有查询执行中都是一致的。

同样,如果两个数据集之间存在排序合并,您将获得访问目标表行的顺序的一致性。

源集合的排序似乎是可取的,但优化器可能不会应用它,因此请检查执行计划。如果不是,则尝试使用 APPEND 和 ORDER BY 子句将数据插入到全局临时表中,然后在没有 order by 子句的情况下从那里进行选择,并探索使用提示来巩固嵌套循环连接。

关于sql - Oracle MERGE 死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16591544/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com