请问你们有没有遇到过mysql update语句更新有时候对数据没影响啊? 麻烦你们帮忙看看, 这个问题困扰了我好几天了.
我在开发中遇到一个问题: 在执行以下代码时有时候能够对数据产生影响有时候不能,而且stmtUpdateDist.executeUpdate()返回的不为0, 说明是在执行更新时是找到了这条记录;.很奇怪不知哪出问题了.
以下代码是放在事务中的
PreparedStatement stmtUpdateDist = conn.prepareStatement(“UPDATE district SET d_next_o_id = d_next_o_id + 1 WHERE d_id = ? AND d_w_id = ?”);
stmtUpdateDist.setInt(1, d_id);
stmtUpdateDist.setInt(2, w_id);
int result = stmtUpdateDist.executeUpdate();
以下是跟踪:
UPDATE district SET d_next_o_id = d_next_o_id + 1 WHERE d_id = ? AND d_w_id = ? 的一部分日志,参数 d_id=7, d_w_id=1(参数在运行时动态的)
2011-04-26 16:45:46,072 FATAL [pool-6-thread-1] controller.Backend (Backend.java:590) – Backend_1 New Order Transaction#29 Arrival.
2011-04-26 16:45:46,125 FATAL [pool-6-thread-1] controller.Backend (Backend.java:271) – Backend_1 New Order Transaction#29(/127.0.0.1:65506)Before UPDATE d_next_o_id#(d_id=7, d_w_id=1) d_next_o_id#3585
2011-04-26 16:45:46,127 FATAL [pool-6-thread-1] controller.Backend (Backend.java:307) – Backend_1 New Order Transaction#29(/127.0.0.1:65506)After UPDATE d_next_o_id# (d_id=7, d_w_id=1) d_next_o_id#3586
2011-04-26 16:45:46,893 FATAL [pool-6-thread-1] controller.Backend (Backend.java:498) – Backend_1 NewOrderTransaction#29 After Commit d_next_o_id#3585
第一个红色标注出来的是在更新之前通过执行该事务的Connection查询出来的d_next_o_id-3585, 查询条件中的参数为(d_id=7, d_w_id=1)
第二个红色标注出来的是在更新之后通过执行该事务的Connection查询出来的d_next_o_id-3586, 查询条件中的参数为(d_id=7, d_w_id=1)
第三个红色标注出来的是在该事务提交之后通过其他Connection查询出来的d_next_o_id-3585, 查询条件中的参数为(d_id=7, d_w_id=1)
MYSQL 5.1.53
Innodb存储引擎
d_id, d_w_id是表的主键
d_next_o_id, d_id, d_w_id都是int(11)
从日志记录上来看,update执行是生效了的,但是在commit后数据有变成了update之前了。那么问题就出在commit这里,你不用程序去执行,手动写sql语句在控制台执行看能否更新成功,另外看一下district表上是否有触发器,触发器有没有对d_next_o_id进行操作