Connection conn = ConnectionUtil.getConnection();
try {
conn.setAutoCommit(false);
conn.createStatement().executeUpdate("update photo set name = 222 where id = 1");
int i = 0;
i = 1/i;
conn.createStatement().executeUpdate("update photo set name = 222 where id = 2");
conn.commit();
} catch (SQLException e) {
// try {
// conn.rollback();
// } catch (SQLException e1) {
// e1.printStackTrace();
// }
} finally{
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}这段代码rollback与不rollback产生的效果是一样的 为什么我要rollback?

解决方案 »

  1.   

    更新失败的时候才进行调用的,如果失败,回滚到上一个状态,比如你更新你的账户,转账1000给你朋友,中间出错,你账户少了1000,朋友缺没收到,如果rollback,出错时会回滚,你钱不变
      

  2.   


    注意我的问题是
    你更新你的账户,转账1000给你朋友,中间出错,你账户少了1000,朋友缺没收到,这时即时我不rollback,当然也没有commit,直接将connection关了,这样结果还是初始状态,和rollback的效果是一样的,那我为什么还要用rollback呢?
      

  3.   

    假如在commit之后出错呢,或者在commit方法某一步报错了呢?
      

  4.   

    commit后 rollback也失去作用了
      

  5.   

    为了防止你的操作有误,执行完更新语句后,数据库没有直接把结果保存,而是保存到session,如果确认无误
    则可以commit(提交),如果有误(或反悔)可以rollback(回滚),因为现实中数据库不可能就执行一条sql语句,如果也有一条sql语句操纵此条数据,没有回滚就会产生脏数据,具体百度脏数据的形成
      

  6.   

    那就不rollback啊 估计是为了保险。。
      

  7.   


    conn.createStatement().executeUpdate("update photo set name = 222 where id = 1");
    ...
    conn.createStatement().executeUpdate("update photo set name = 222 where id = 2"); 
    这两句代码,假设在执行第一句执行完后,数据库服务器故障,抛出异常了,第二句就没有执行。这时候数据库的情况就是:id为1的name更新了,id为2的name没有更新。假设业务逻辑不能容忍这种只执行一半的情况,那么就应该rollback,把id为1的name恢复到一切执行之前的情况。
    如果业务逻辑可以容忍这种只执行一半SQL的行为,那就不需要rollback。数据库事务控制的精髓就一句话:对于一堆sql语句来说,要么都执行,要么都不执行。其中“要么都不执行”的部分,就是用rollback实现的
      

  8.   

    都没试过吗 , 抛异常即使不执行rollback也没关系的,一样不会将更新写入数据库的。