如何做一个安全的;选择“更新”选项;在DB2上的多个表上使用WHERE条件? 问题
在DB2(版本9.5)上,SQL语句如何做一个安全的;选择“更新”选项;在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
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上做了一些测试,它没有死锁