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?
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?
注意我的问题是
你更新你的账户,转账1000给你朋友,中间出错,你账户少了1000,朋友缺没收到,这时即时我不rollback,当然也没有commit,直接将connection关了,这样结果还是初始状态,和rollback的效果是一样的,那我为什么还要用rollback呢?
则可以commit(提交),如果有误(或反悔)可以rollback(回滚),因为现实中数据库不可能就执行一条sql语句,如果也有一条sql语句操纵此条数据,没有回滚就会产生脏数据,具体百度脏数据的形成
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实现的