如何做一个安全的;选择“更新”选项;在DB2上的多个表上使用WHERE条件? 问题

如何做一个安全的;选择“更新”选项;在DB2上的多个表上使用WHERE条件? 问题,db2,database-deadlocks,Db2,Database Deadlocks,在DB2(版本9.5)上,SQL语句 SELECT o.Id FROM Table1 o, Table2 x WHERE [...] FOR UPDATE WITH RR 给我错误消息SQLSTATE=42829(不允许使用FOR UPDATE子句,因为无法修改游标指定的表) 附加信息 我需要使用RR指定,因为我在隔离级别READ_COMMITTED上运行,但我需要在另一个进程运行相同查询时阻止我的查询 到目前为止的解决方案。。。 如果我改为这样询问: SELECT t.Id FROM Tab

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

SELECT o.Id FROM Table1 o, Table2 x WHERE [...] FOR UPDATE WITH RR
给我错误消息
SQLSTATE=42829
(不允许使用FOR UPDATE子句,因为无法修改游标指定的表)

附加信息 我需要使用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
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
一切正常

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

问题:
有没有一种方法可以在不引入死锁可能发生的位置的情况下为UPDATE制定
查询?

首先,对于提交隔离级别
READ\u
,您不需要使用RR指定
,因为这会导致隔离级别
可序列化
。用RS指定
(读取稳定性)就足够了

要将使用RS更新的
传播到内部,请选择您必须另外指定
使用并保持更新锁

因此,完整的语句如下所示:

SELECT t.Id FROM Table t WHERE t.Id IN (
    SELECT o.Id FROM Table1 o, Table2 x WHERE [...]
) FOR UPDATE WITH RR
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上做了一些测试,它没有死锁