我正在对这样的DB2表进行更新(java代码):// Some code ripped out for brevity...sql.append(UPDATE + TABLE_THREADS + );sql.append(SET STATUS = ? );sql.append(WHERE ID = ?);conn = getConn();...

我正在对这样的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;
很长一段时间后,我得到一个回滚和一条错误消息:
由死锁或超时引起的不成功的执行.原因代码00C9008E,资源类型00000302和资源名称SOME.THING.X’000002′. SQLCODE = -913,SQLSTATE = 57033,DRIVER = 3.57.82
documentation for error -913说这个REASON CODE意味着它是暂停.资源类型00000302是一个表空间页面,我根本无法识别资源名称.
当我自己运行SQL时,它工作正常:
UPDATE MY.THREADS
SET STATUS = 1
WHERE ID = 156
我可以选择并查看状态是否已更新. (虽然当我在超时之前的漫长等待期间运行此SQL时,我遇到了同样的问题.它需要永远,我只是取消它).
事务中发生了一些事情,我没有看到对此表或记录的任何其他更新.表上有创建/删除触发器,但没有更新触发器.我没有看到任何选择游标,或奇怪的隔离级别更改.我在交易中看不到会引起这种情况的其他因素.
为什么我收到此错误?我还应该在交易中寻找什么呢?
编辑:
我从代码的开头逐步完成代码,直到它被“卡住”.似乎有2个DAO,它们都创建了一个事务.我认为这可能是问题所在.
解决方法:
很抱歉回答我自己的问题,但我发现了问题所在.这是一个有点自制的框架,其中DAO跟踪它自己的连接.
conn = getConn();
这将在显式事务中为每个DAO方法返回相同的连接.
当我逐步完成代码时,我发现我在事务中调用的方法是创建一个新事务,一个新的DAO,从而创建一个新的数据库连接.所以现在我打开了2个交易和2个连接.在这一点上很容易看出,我实际上是在陷入僵局.
这让我有点意外,因为我之前的应用程序允许嵌套事务. (对两个事务使用相同的DB连接)
本文标题为:java – 超时更新DB2表


基础教程推荐
- Java zookeeper服务的使用详解 2023-03-22
- SpringBoot整合Docker实现一次构建到处运行的操作方法 2023-06-17
- 使用IDEA编写jsp时EL表达式不起作用的问题及解决方法 2023-07-31
- Java获取Excel中图片所在的行和列坐标位置 2023-03-22
- Spring配置与依赖注入基础详解 2023-04-06
- Java ThreadLocal类使用详解 2023-02-18
- Spring AOP代理详细介绍 2023-08-02
- Java设置Excel数据验证的示例代码 2022-12-02
- 一起聊聊Java中的自定义异常 2023-04-17
- Spring BOOT AOP基础应用教程 2023-02-18