我们在z / OS上使用DB2有效版本8(或多或少,因此没有CUR_COMMIT)。
在我们的(基于Java,虽然这不应该是相关的)应用程序中,存在一个在事务中运行的方法,并根据我们将调用的某个列的值从名为MY_TABLE的表中删除多个记录。 SPECIAL_COLUMN,执行语句
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 =时抛出?声明。根据{{3}},这似乎与放置在"页面"上的锁相关。
我的问题如下:
实际上可以同时为多个行对应的SPECIAL_COLUMN的相同值执行两个DELETE语句会导致这种死锁(我想到的情况如下所示) :第一个声明"在#34;第一页",第二个声明"锁定"在"第二页&#34 ;,然后第一个语句等待"第二页"的锁定,而第二个语句等待"第一页"的锁定。 或者放置这样的锁是" atomic",这意味着如果第一个语句已经开始放锁,那么第二个会等待吗?
SPECIAL_COLUMN的不同值的相同问题(似乎更有可能)
如果这种情况是可能的,并且可能是观察到死锁的原因(否则我们必须检查" unsuspicios"到目前为止SQL),这可能是一个合理的解决方案? (我已经考虑过同步Java代码了,但我认为这不是一个好主意;我还考虑过在删除行之前对要删除的行发出SELECT FOR UPDATE,但是因为会涉及额外的锁定,所以我是对此也非常怀疑。)
编辑:
链接到有关类似问题的报告http://www.idug.org/p/fo/et/thread=20542