我正在对这样的 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;
过了一会儿,我收到回滚和错误消息:
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
我可以SELECT
看到状态已更新。(虽然当我在超时前的长时间等待期间运行此 SQL 时,我遇到了同样的问题。它需要很长时间,我只是取消它)。
事务中发生了几件事,我看不到此表或记录的任何其他更新。表上有创建/删除触发器,但没有更新触发器。我没有看到任何带有游标的选择,或者奇怪的隔离级别更改。我在交易中没有看到太多会导致这种情况的其他东西。
为什么我会收到此错误?我还应该在交易中寻找什么?
编辑:
我从请求的开头逐步浏览了代码,直到它被“卡住”。好像有 2 个 DAO 并且他们都在创建一个事务。我认为这可能是问题所在。