伪代码如下:
String commitFlag=0;
try{
if 不符合业务规则
commitFlag=1;
}catch(Exception e){
commitFlag=1;
}finally{
if commit==0
commit;
else
rollback;
}
当然不能将食物提交放到finally代码块中,但是针对楼上将rollback放到finally中我不是很认同。产生异常就需要rollback,所以rollback应该是放到catch代码块中,然后将事务关闭放到finally中。
这是个好问题啊
个人想法:
如果异常都能捕获的话,整个逻辑是没问题的;但如果如果发生异常且未捕获,而你的commitFlag=0的话,事务就不应该提交
try/catch/finally结构有固定的执行顺序,详细请查阅资料。
题目中这样处理,如果提交过程中出现异常,将没有机会捕捉到。
更合适的方式如下:
boolean committed = false;
try {
// Do stuff
commit(session);
committed = true;
} catch (HibernateException e) {
logger.error("delete failed", e);
throw e;
} finally {
if (!committed) {
rollback(session);
}
// TODO: This won't execute if rollback fails.
// Check whether that's a problem.
close(session);
}
基本思路是: 设置一个布尔变量,在try块提交,在finally块检查此布尔变量,如果出现异常,则回滚。
如果对您有帮助,请采纳答案好吗,谢谢!