Concurrency 一个删除多行的delete语句会导致死锁吗?

Concurrency 一个删除多行的delete语句会导致死锁吗?,concurrency,db2,database-deadlocks,db2-zos,Concurrency,Db2,Database Deadlocks,Db2 Zos,我们在z/OS上使用DB2有效版本8(或多或少,因此没有CUR_COMMIT) 在我们的(基于Java的,尽管这不应该相关)应用程序中,存在一个方法,该方法在事务中运行,并根据某一列的值(我们称之为特殊列)从名为MY_table的表中删除多条记录,执行该语句 DELETE FROM MY_TABLE WHERE SPECIAL_COLUMN=? 除了执行这个语句外,还会执行一些其他SQL语句,我省略了这些语句,因为目前我认为它们可能与我描述的问题无关 同时运行该方法时,我们有时会看到异常 ne

我们在z/OS上使用DB2有效版本8(或多或少,因此没有CUR_COMMIT)

在我们的(基于Java的,尽管这不应该相关)应用程序中,存在一个方法,该方法在事务中运行,并根据某一列的值(我们称之为特殊列)从名为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 
在执行从MY_表中删除时抛出,其中SPECIAL_COLUMN=?陈述根据这种说法,这似乎与“页面”上的锁有关

我的问题如下:

  • 事实上,两条DELETE语句是否可以同时执行,用于多行对应的特殊_列的相同值,从而导致这种死锁(我想到的一种情况是:第一条语句在“第一页”上“锁定”,第二条语句在“第二页”上“锁定”),然后第一条语句等待“第2页”上的锁,而第二条语句等待“第1页”上的锁。 或者这种锁的放置是“原子的”,这意味着如果第一条语句已经开始放置锁,第二条语句将等待

  • 对于特殊列的不同值,同样的问题(似乎更有可能)

  • 在这种情况下,这样的场景是可能的,并且可能是观察到死锁的原因(否则我们将不得不检查到目前为止的“unspicios”SQL),哪一种可能是合理的解决方案?(我曾考虑过同步Java代码,但我认为这不是一个好主意;我也曾考虑过在执行delete之前对要删除的行发出SELECT FOR UPDATE,但由于将涉及额外的锁,我对此也非常怀疑)

    编辑:


    链接到一个类似问题的报告

    是的,两者都有可能,所以?@mustaccio谢谢你,我真的问了(在我问题的末尾)对于此问题,什么可能是合理的解决方案。您能建议一个可能的路径吗?如果您在频繁提交的情况下,在适当的索引下逐个删除唯一标识的记录,您不太可能遇到死锁。任何其他解决方案都会在不同程度上受到锁冲突和/或竞争条件的影响。mo如果不熟悉您的数据库和应用程序,就不可能重新给出详细的答案。非常感谢,我将这样做(当然要记住,要按定义良好的顺序删除行,例如按主键排序)。删除的顺序完全不重要。但是,我假设您知道逐个删除行会对性能产生影响。始终存在权衡。