为什么有时候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();

解决方案 »

  1.   

    1、检查SQL语句是否正确;
    2、检查事务是否提交;
    3、检查一下表间关系。
      

  2.   


    SQL语句是正确的直接在数据上运行时可以的.
    事务已经提交了
    d_id, d_w_id是表的主键, 没有设置外键
      

  3.   

    为什么有时候update语句没对数据产生影响呢?不可能出现有时候成功,有时候失败的情况。
    除非你的SQL语句本身有问题。
      

  4.   

    没对数据产生影响的SQL语句是什么 ?
      

  5.   

    d_id, d_w_id是表的主键 
    d_next_o_id, d_id, d_w_id都是int(11)
    SQL 语句也跟踪了没发现问题
    就是奇怪有时候可以有时候每影响.
      

  6.   

    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();
      

  7.   


    d_w_id, d_id 都是随机生成的.
    d_w_id现在只有一个值 
    d_id有10个值 1~9直接在数据库上测试了几个是可以的.
    事务部分代码没贴出来.
    关键是有时可以有时步行
      

  8.   

    UPDATE district SET d_next_o_id = d_next_o_id + 1 WHERE d_id = ? AND d_w_id = ?
    变量内容 是什么
      

  9.   


    d_w_id=1
    d_id有10个值 1~10 是随机的
    d_next_o_id,d_w_id, d_id 都是int(11)
      

  10.   


    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)
      

  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-3586, 查询条件中的参数为(d_id=7, d_w_id=1)第三个红色标注出来的是在该事务提交之后通过其他Connection查询出来的d_next_o_id-3585, 查询条件中的参数为(d_id=7, d_w_id=1)
      

  12.   


    首先, 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点可以看出在同一个事务中是更新了.只是提交后没效果.
      

  13.   

    建议打开你的 一般查询日志,然后看一下到底执行了什么语句,有没有COMMIT。