java为什么我必须在JDBC中使用回滚?
如果我不使用connection.rollback()
,由于事务尚未提交,我可以看到数据库的数据也不会更改任何内容,那么为什么我仍然需要使用connection.rollback()
try {
connection.setAutoCommit(false);
bankDao.transferMoney(+2000, 1, connection); //account1:+$2000
if(true){
throw new RuntimeException(); //make error
}
bankDao.transferMoney(-2000, 2, connection);//account2:-$2000
connection.commit();
} catch (Exception e) {
try {
connection.rollback();
System.out.println("something wrong, roll back");
} catch (Exception e1) {
e1.printStackTrace();
}
}
# 1 楼答案
您是对的,当发生异常时,数据不会提交,事务最终将由数据库回滚
InnoDB内部隐式地在错误InnoDB error handling上使用rollbak,但除非您真正理解所有场景,否则会显式地调用connection。rollback()可以确保事务尽早结束(回滚)。请注意,当调用commit或rollback时,事务结束
在示例代码中,如果异常发生在commit()以外的行上,比如bankDao,该怎么办。因为某种原因转移资金
您需要使用Rollaback来结束交易