DAO方法中的事务回滚

时间:2013-11-04 12:17:18

标签: java spring hibernate transactions

从我的DAO方法我需要返回一个结果(即使发生了异常)。我尝试以这种方式执行它,因为它在异常的情况下不起作用(我有例外:don't flush the Session after an exception occurs)。

@Repository
@Transactional(rollbackFor=HibernateException.class)
public class UserDAO {

    @Override
    public boolean save(Proxy proxy) {
        try{
            sessionFactory.getCurrentSession().save(proxy);
        }
        catch(HibernateException e){
            //TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            return false;
        }
        return true;
    }

}

但是当我取消注释//TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();时 一切都像我期待的那样。我知道文档不建议使用这种方法,但注释回滚对我不起作用。你能解释一下,为什么?如果可能,我可以修改代码以使其正常工作吗?

3 个答案:

答案 0 :(得分:4)

如果带注释的方法抛出指定的异常,则

rollbackFor属性有效。在你的情况下,异常被捕获在方法内部并且不会传播,因此rollbackFor没有效果。

答案 1 :(得分:4)

只有在方法抛出异常时,Spring才会回滚。如果它被抛出并被捕获到方法内部,那么Spring对该异常一无所知,因此认为一切都很顺利,因此不会回滚事务。

因此,要么保持对setRollbackOnly的调用,要么更优先不要使用布尔结果来指示操作成功或失败。如果保存不成功,则会抛出异常

答案 2 :(得分:1)

如果你确实需要返回一个值而不是向你的调用者抛出异常,你需要依赖setRollbackOnly(),我认为这不是很糟糕,但很标准。

此外,我认为抛出异常是一个更好的主意,因为当有“假”时,你的来电者不会知道出了什么问题。否则,您可能需要返回错误代码或错误消息或更有意义的错误'。