一尘不染

Spring 3 / Hibernate中回滚事务的最佳实践

hibernate

参考Spring文档

任何RuntimeException都会触发回滚,而任何选中的Exception都不会

引用javapractices.com

未经检查的异常:

  • 表示程序中的缺陷(错误)-通常将无效的参数传递给非私有方法。引用Gosling,Arnold和Holmes的《
    Java编程语言》:“未经检查的运行时异常表示的条件通常可以反映程序逻辑中的错误,并且不能在运行时从中合理地恢复。”
    * 是RuntimeException的子类,通常使用IllegalArgumentException,NullPointerException或IllegalStateException实现
  • 一个方法没有义务为由其实现引发的未经检查的异常建立策略(并且它们几乎总是不这样做)

检查异常:

  • 表示程序无法直接控制的区域中的无效条件(无效的用户输入,数据库问题,网络中断,文件缺失)
  • 是Exception的子类
  • 一个方法必须为由其实现抛出的所有检查的异常建立一个策略(将检查的异常进一步传递到堆栈中,或以某种方式进行处理)

如果在业务逻辑过程中发现问题并且想要回滚更改,是否必须抛出新的RuntimeException?因为我已经在逻辑中识别出它,所以它实际上不是RuntimeException(未经检查的异常)。还是我误解了这些概念?

我的真正问题是 ,在@Transactional服务方法中回滚事务的最佳实践是什么?


阅读 198

收藏
2020-06-20

共1个答案

一尘不染

如果您使用的是检查异常,则只需将它们添加到注释的rollbackFor属性中@Transactional

@Transactional(rollbackFor = { MyInvalidUserException.class, MyApplicationException.class })
public void method() throws MyInvalidUserException,  MyApplicationException { 
    ... 
    ... 
}

等等

org.life.java的 答案也很好。如果您想将程序化事务管理混入声明性事务中或严格保留声明性事务,这是一个学术决策。

2020-06-20