我们在 z/OS 上使用 DB2 有效版本 8(或多或少,所以没有 CUR_COMMIT)。
在我们的(基于 Java 的,虽然这不应该是相关的)应用程序中存在一个方法,它在事务中运行,并根据我们将称为 SPECIAL_COLUMN 的某个列的值从名为 MY_TABLE 的表中删除多条记录,执行该声明
DELETE FROM MY_TABLE WHERE SPECIAL_COLUMN=?
除了执行这条语句之外,还执行了一些其他的 SQL 语句,我省略了这些语句,因为目前我认为它们可能与我描述的问题无关。
并发运行该方法我们有时会看到异常
nested exception is com.ibm.db2.jcc.am.SqlException:
UNSUCCESSFUL EXECUTION CAUSED BY DEADLOCK OR TIMEOUT. REASON CODE 00C90088, TYPE OF RESOURCE 00000302, AND RESOURCE NAME ... SQLCODE=-913, SQLSTATE=57033, DRIVER=3.63.131
在执行 DELETE FROM MY_TABLE WHERE SPECIAL_COLUMN=? 期间抛出 陈述。根据http://www.idug.org/p/fo/et/thread=20542,这似乎与放置在“页面”上的锁有关。
我的问题如下:
实际上,对于多行对应的 SPECIAL_COLUMN 的相同值同时执行的两个 DELETE 语句是否会导致这种死锁(我想到的场景类似于以下内容:第一条语句在“第一页”上“加锁” ”,第二条语句在“第二页”上“加锁”,然后第一条语句等待“第二页”上的锁,而第二条语句等待“第一页”上的锁。或者是放置这样的锁是“原子的”,意思是如果第一个语句已经开始放锁,第二个会等待吗?
SPECIAL_COLUMN 的不同值的相同问题(似乎更有可能)
如果这种情况是可能的,并且可能是观察到死锁的原因(否则我们将不得不检查到目前为止“不可疑”的 SQL),这可能是一个合理的解决方案?(我曾考虑过同步 Java 代码,但我认为这不是一个好主意;我也想过在删除之前对要删除的行发出 SELECT FOR UPDATE ,但由于会涉及额外的锁,所以我是对此也很怀疑)。
编辑:
链接到类似问题的报告http://www.dbforums.com/showthread.php?575408-db2-OS390-TABLE-LOCK-DURING-DELETE