JAVA事物提交放在finally可行吗?有什么影响

伪代码如下:
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块检查此布尔变量,如果出现异常,则回滚。

如果对您有帮助,请采纳答案好吗,谢谢!