我从servlet到DB2一个接一个地调用update语句。我收到错误sqlstate 40001,原因代码68,我发现它是由于死锁超时。
答案 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://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 语句)