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

时间:2011-10-31 18:18:07

标签: db2

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

  • 如何解决此问题?
  • 可以通过设置查询超时来解决吗?
  • 如果是,那么如何在servlet中使用更新语句或在何处使用它?

2 个答案:

答案 0 :(得分:12)

原因代码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等等。

取自:http://publib.boulder.ibm.com/infocenter/db2luw/v9r7/topic/com.ibm.db2.luw.admin.trb.doc/doc/t0055074.html

建议阅读:http://www.ibm.com/developerworks/data/library/techarticle/dm-0511bond/index.html

附录:如果您的servlet或其他有罪应用程序使用select语句被发现参与死锁,如果新更新(或插入)的准确性,您可以尝试将with ur附加到select语句)数据并不重要。

答案 1 :(得分:0)

对我来说,解决方案是在所有 SELECT 语句的末尾添加 FOR READ ONLY WITH UR。 (显然我的 select 语句返回了如此多的数据,它锁定表的时间足够长以干扰其他 SQL 语句)

https://www.ibm.com/support/knowledgecenter/SSEPEK_10.0.0/sqlref/src/tpc/db2z_sql_isolationclause.html