为什么有时候update语句没对数据产生影响呢?以下代码是放在一个事务里面的, 在事务提交后返回的结果result并不为0, 但数据库中的数据还是更新之前的.用的是MYSQL 5.1.53
Innodb存储引擎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);result = stmtUpdateDist.executeUpdate();
2、检查事务是否提交;
3、检查一下表间关系。
SQL语句是正确的直接在数据上运行时可以的.
事务已经提交了
d_id, d_w_id是表的主键, 没有设置外键
除非你的SQL语句本身有问题。
d_next_o_id, d_id, d_w_id都是int(11)
SQL 语句也跟踪了没发现问题
就是奇怪有时候可以有时候每影响.
stmtUpdateDist.setInt(2, w_id);result = stmtUpdateDist.executeUpdate();
d_w_id, d_id 都是随机生成的.
d_w_id现在只有一个值
d_id有10个值 1~9直接在数据库上测试了几个是可以的.
事务部分代码没贴出来.
关键是有时可以有时步行
变量内容 是什么
d_w_id=1
d_id有10个值 1~10 是随机的
d_next_o_id,d_w_id, d_id 都是int(11)
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以上已跟踪:
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第一个红色标注出来的是在更新之前通过执行该事务的Connection查询出来的d_next_o_id-3585, 查询条件中的参数为(d_id=7, d_w_id=1)第二个红色标注出来的是在更新之后通过执行该事务的Connection查询出来的d_next_o_id-3585, 查询条件中的参数为(d_id=7, d_w_id=1)第三个红色标注出来的是在该事务提交之后通过其他Connection查询出来的d_next_o_id-3585, 查询条件中的参数为(d_id=7, d_w_id=1)
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以上已跟踪:
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第一个红色标注出来的是在更新之前通过执行该事务的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)
首先, result = stmtUpdateDist.executeUpdate();返回的不是0, 说明找到了对应的记录.
其次, UPDATE district SET d_next_o_id = d_next_o_id + 1 WHERE d_id = ? AND d_w_id = ?, 不会出现要更新的内容与该记录已存在的内容完全相同的情况.再次,在日志跟踪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)过程中发现:1.在更新之前通过执行该事务的Connection查询出来的d_next_o_id-3585, 查询条件中的参数为(d_id=7, d_w_id=1)2.在更新之后通过执行该事务的Connection查询出来的d_next_o_id-3586, 查询条件中的参数为(d_id=7, d_w_id=1)3.在该事务提交之后通过其他Connection查询出来的d_next_o_id-3585, 查询条件中的参数为(d_id=7, d_w_id=1)
第2点可以看出在同一个事务中是更新了.只是提交后没效果.