更新 DB2 表超时

Jes*_*ess 5 java sql db2

我正在对 DB2 表进行更新,如下所示(java 代码):

// Some code  ripped out for brevity...
sql.append("UPDATE " + TABLE_THREADS + " ");
sql.append("SET STATUS = ? ");
sql.append("WHERE ID = ?");

conn = getConn();
pstmt = conn.prepareStatement(sql.toString());
int idx1 = 0;
pstmt.setInt(++idx1, status);
pstmt.setInt(++idx1, id);
int rowsUpdated = pstmt.executeUpdate();
return rowsUpdated;
Run Code Online (Sandbox Code Playgroud)

过了很长一段时间,我收到回滚和错误消息:

UNSUCCESSFUL EXECUTION CAUSED BY DEADLOCK OR TIMEOUT. REASON CODE 00C9008E, TYPE OF RESOURCE 00000302, AND RESOURCE NAME SOME.THING.X'000002'. SQLCODE=-913, SQLSTATE=57033, DRIVER=3.57.82

错误 -913 的文档表示此原因代码意味着超时。资源类型,00000302是表空间页,我根本不认识资源名称。

当我单独运行 SQL 时,它工作得很好:

UPDATE MY.THREADS
SET STATUS = 1
WHERE ID = 156
Run Code Online (Sandbox Code Playgroud)

我可以SELECT看到状态已更新。(尽管当我在超时前的漫长等待期间运行此 SQL 时,我遇到了同样的问题。它需要很长时间,我只是取消它)。

事务中发生了几件事,我没有看到此表或记录的任何其他更新。表上有创建/删除触发器,但没有更新触发器。我没有看到任何带有光标的选择,也没有看到奇怪的隔离级别更改。我在交易中没有看到太多其他会导致这种情况的情况。

为什么我会收到此错误?在交易中我还应该寻找什么?


编辑:

我从请求的开头逐步执行了代码,直到它“卡住”的地方。看起来好像有 2 个 DAO,并且它们都在创建一个交易。我认为这可能是问题所在。

Jes*_*ess 3

很抱歉回答我自己的问题,但我发现了问题。这是一个有点自制的框架,其中 DAO 跟踪它自己的连接。

conn = getConn();
Run Code Online (Sandbox Code Playgroud)

这将为显式事务中的每个 DAO 方法返回相同的连接。

当我单步执行代码时,我发现我在事务中调用的方法正在创建一个新事务、一个新 DAO,从而创建一个新数据库连接。所以现在我有 2 个打开的事务和 2 个连接。此时很容易看出,我实际上陷入了僵局。

这让我有点惊讶,因为我之前开发的应用程序允许嵌套事务。(两个事务使用相同的数据库连接)

  • 那么你绝对应该接受你自己的答案!解决你自己的问题是没有问题的。 (2认同)