首页 新闻 会员 周边

mysql update语句更新有时候对数据库没影响?

0
悬赏园豆:100 [已关闭问题] 关闭于 2011-04-29 18:05

请问你们有没有遇到过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)

fjzag的主页 fjzag | 菜鸟二级 | 园豆:300
提问于:2011-04-26 18:59
< >
分享
所有回答(1)
0

从日志记录上来看,update执行是生效了的,但是在commit后数据有变成了update之前了。那么问题就出在commit这里,你不用程序去执行,手动写sql语句在控制台执行看能否更新成功,另外看一下district表上是否有触发器,触发器有没有对d_next_o_id进行操作

青 蛙 | 园豆:655 (小虾三级) | 2011-04-27 09:21
district表上没有触发器. 在数据库控制台下手写可以的.
支持(0) 反对(0) fjzag | 园豆:300 (菜鸟二级) | 2011-04-27 09:28
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册