gpt4 book ai didi

db2 - 如何使用 WHERE 条件对 DB2 上的多个表执行安全的 "SELECT FOR UPDATE"?

转载 作者:行者123 更新时间:2023-12-04 01:57:59 29 4
gpt4 key购买 nike

问题

在 DB2(版本 9.5)上,SQL 语句

SELECT o.Id FROM Table1 o, Table2 x WHERE [...] FOR UPDATE WITH RR

给我错误信息 SQLSTATE=42829 (不允许使用 FOR UPDATE 子句,因为无法修改游标指定的表)。

附加信息

我需要指定 WITH RR ,因为我在隔离级别运行 READ_COMMITTED ,但是当有另一个进程运行相同的查询时,我需要阻止我的查询。

解决方案到此为止...

如果我改为这样查询:
SELECT t.Id FROM Table t WHERE t.Id IN (
SELECT o.Id FROM Table1 o, Table2 x WHERE [...]
) FOR UPDATE WITH RR

一切正常。

新问题

但是现在,当多个进程同时执行此查询时,我偶尔会遇到死锁异常。



有没有办法制定 FOR UPDATE查询而不引入可能发生死锁的地方?

最佳答案

首先,对于隔离级别 READ_COMMITTED您不需要指定 WITH RR ,因为这会导致隔离级别 SERIALIZABLE .指定 WITH RS (读取稳定性)就足够了。

传播 FOR UPDATE WITH RS对于内部选择,您必须另外指定 USE AND KEEP UPDATE LOCKS .

所以完整的语句如下所示:

SELECT t.Id FROM Table t WHERE t.Id IN (
SELECT o.Id FROM Table1 o, Table2 x WHERE [...]
) FOR UPDATE WITH RS USE AND KEEP UPDATE LOCKS

我通过 JDBC 对 DB2 进行了一些测试,并且没有死锁。

关于db2 - 如何使用 WHERE 条件对 DB2 上的多个表执行安全的 "SELECT FOR UPDATE"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3881965/

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