参考Spring文档:
任何RuntimeException都会触发回滚,而任何已检查的异常将不会。
Unchecked exceptions:
- 表示程序中的缺陷(错误) - 经常是传递给非私有方法的无效参数。引用《Java编程语言》(Gosling、Arnold和Holmes):“未经检查的运行时异常表示条件,一般来说,反映了您的程序逻辑中的错误,并且无法在运行时合理地恢复。”
- 是RuntimeException的子类,并且通常使用IllegalArgumentException、NullPointerException或IllegalStateException实现
- 方法不需要为其实现引发的未经检查的异常建立策略(它们几乎从不这样做)
Checked exceptions:
- 表示程序控制范围之外的无效条件(无效用户输入、数据库问题、网络中断、缺少文件)
- 是Exception的子类
- 方法需要为其实现引发的所有已检查异常建立策略(将已检查异常传递到堆栈上方,或以某种方式处理)
如果在我的业务逻辑中发现问题并且我想回滚更改,那么我必须抛出新的RuntimeException吗?这实际上不是RuntimeException(未经检查的异常),因为我已经在逻辑中识别了它。或者可能我误解了这些概念?
我的真正问题是,在我的@Transactional服务方法中,回滚事务的最佳实践是什么?