DB2死锁超时Sqlstate:40001,原因代码68,因为使用SQL从servlet调用了更新语句

DB2死锁超时Sqlstate:40001,原因代码68,因为使用SQL从servlet调用了更新语句,db2,Db2,我将从servlet一个接一个地调用update语句到DB2。我得到错误sqlstate 40001,原因代码68,我发现这是由于死锁超时 我如何解决这个问题? 是否可以通过设置查询超时来解决此问题? 如果是,那么如何将其与servlet中的update语句一起使用,或者在何处使用它? 原因代码68已经告诉您这是由于锁定超时死锁原因代码2可能是由于其他用户在同一时间运行查询,使用您正在访问的相同数据,或者您自己的多次更新 首先从db2命令行运行db2pd-db locktest-locks sh

我将从servlet一个接一个地调用update语句到DB2。我得到错误sqlstate 40001,原因代码68,我发现这是由于死锁超时

我如何解决这个问题? 是否可以通过设置查询超时来解决此问题? 如果是,那么如何将其与servlet中的update语句一起使用,或者在何处使用它?
原因代码68已经告诉您这是由于锁定超时死锁原因代码2可能是由于其他用户在同一时间运行查询,使用您正在访问的相同数据,或者您自己的多次更新

首先从db2命令行运行db2pd-db locktest-locks show detail来查看锁的位置。然后,您需要运行以下操作:

select tabschema, tabname, tableid, tbspaceid 
from syscat.tables where tbspaceid = # and tableid = #
用从db2pd命令输出中获得的ID号填充符号

一旦您看到锁在哪里,以下是一些提示:

◦死锁频率有时可以通过确保所有应用程序以相同的顺序访问其公共数据来降低,例如,这意味着它们访问并因此锁定表A、表B、表C中的行,等等

摘自:

建议阅读:


附录:如果您的servlet或另一个有罪应用程序正在使用发现与死锁有关的select语句,如果新更新或插入的数据的准确性不重要,您可以尝试在select语句中添加这些语句。

对于我来说,解决方案是在我所有select语句的末尾添加UR,以便只读。显然,我的select语句返回了太多的数据,它锁定表的时间长到足以干扰其他SQL语句


请参见

需要注意的是,这篇文章讨论的是减少死锁的频率,而不是完全防止死锁。按照一致的锁定顺序并不能防止死锁。我们所能做的最多的就是减少他们的频率。