2 julushi1989 julushi1989 于 2017.09.17 20:15 提问

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

伪代码如下:
String commitFlag=0;
try{
if 不符合业务规则
commitFlag=1;
}catch(Exception e){
commitFlag=1;
}finally{
if commit==0
commit;
else
rollback;
}

3个回答

xiaoming120915
xiaoming120915   2017.09.18 09:11
已采纳

当然不能将食物提交放到finally代码块中,但是针对楼上将rollback放到finally中我不是很认同。产生异常就需要rollback,所以rollback应该是放到catch代码块中,然后将事务关闭放到finally中。

julushi1989
julushi1989 还是传统模式稳妥,最后还是用这种方式处理了,
2 个月之前 回复
wuwenfengl
wuwenfengl   2017.09.17 22:03

这是个好问题啊
个人想法:
如果异常都能捕获的话,整个逻辑是没问题的;但如果如果发生异常且未捕获,而你的commitFlag=0的话,事务就不应该提交

wuwenfengl
wuwenfengl 回复Micky2012mq: 不明白你的判断遗漏为什么会发生,没有else吗?
2 个月之前 回复
julushi1989
julushi1989 处理方式是所有不符合规则的数据都通过异常抛出,在catch块统一捕获,统一赋值。所以判定漏了的情况基本可以避免。其实就算放在try层提交事务,也是存在判断遗漏的情况。放在finally层统一处理是因为有些新手老是会忘记在catch层回滚。导致整个系统异常,放finally至少事务会做最后的处理,不影响系统正常运行。但是这样做又担心是否会引发其他问题?
2 个月之前 回复
fight_in_dl
fight_in_dl   Ds   Rxr 2017.09.18 05:55

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

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

julushi1989
julushi1989 谢谢,考虑再三。还是决定按传统模式try中提交,catch中回滚。finally中人为控制有风险,如果业务逻辑复杂,容易误判,容易误提交或回滚。
2 个月之前 回复
fight_in_dl
fight_in_dl 以上为伪代码,主要看一下逻辑结构。
2 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片