如果我不使用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();
}
}
Run Code Online (Sandbox Code Playgroud)
您需要显式回滚以确保事务结束。如果您没有明确提交或回滚,那么 - 如果继续使用连接 - 应用程序的其他部分稍后可能会意外提交更改。显式回滚可以防止这种情况。
在其他情况下,连接关闭将结束事务。然而,连接关闭是提交还是回滚事务取决于驱动程序。该Connectionc.close()文件说:
据强烈推荐该应用程序显式提交或回滚调用Close方法之前备份活动事务。如果
close调用该方法并且存在活动事务,则结果是实现定义的。
不明确回滚你的事务也可能导致事务比需要的时间长,持有锁等可能会阻止其他事务完成它们的工作。
小智 2
你说得对,发生异常时数据不会提交,事务最终会被数据库回滚。
InnoDB内部有隐式的错误回滚,InnoDB错误处理,但除非你真正理解所有场景,否则显式调用connection.rollback()可以确保事务尽早结束(回滚)。请注意,当您调用提交或回滚时,事务就会结束。
在示例代码中,如果异常出现在 commit() 以外的行(例如由于某种原因bankDao.transferMoney)怎么办?
您需要回滚来结束事务。
| 归档时间: |
|
| 查看次数: |
1017 次 |
| 最近记录: |