我需要从我的 DAO 方法返回一个结果(即使发生异常)。我尝试以这种方式进行操作,因为它在异常情况下不起作用(我有一个异常(exception):发生异常后不要刷新 session
)。
@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();
一切都像我期望的那样工作。我知道文档不建议使用这种方法,但注释回滚对我不起作用。你能解释一下吗,为什么?如果可能的话,我可以修改代码以使其工作吗?
最佳答案
只有方法抛出异常,Spring才会回滚。如果它被抛出并捕获在方法内部,Spring 对异常一无所知,因此认为一切正常,因此不会回滚事务。
因此,要么继续调用 setRollbackOnly,要么最好不要使用 boolean 结果来指示操作成功或失败。如果保存不成功,则应该抛出异常。
关于java - DAO方法中的事务回滚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19767594/