代码之家  ›  专栏  ›  技术社区  ›  tangens

如何对一个DB2上的多个表使用WHERE条件进行安全的“SELECT FOR UPDATE”?

  •  11
  • tangens  · 技术社区  · 15 年前

    问题

    在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 查询时不引入死锁可能发生的位置?

    1 回复  |  直到 15 年前
        1
  •  15
  •   zuserus    15 年前

    首先,有隔离级别 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上做了一些测试,它没有死锁。

    推荐文章