在 Spring 中,@Transactional 默认只对 RuntimeException(运行时异常)和 Error(非常规错误,如OutOfMemoryError、StackOverflowError) 进行回滚,对 IOException, SQLException这类检查异常,则不会回滚。
Throwable
├── Error ← 非常规错误(如 OutOfMemoryError)
└── Exception
├── RuntimeException ← 未检查异常(如 IllegalArgumentException)
└── 其他 Exception ← 检查异常(如 IOException、SQLException)
在大多数业务场景下,建议显式设置 rollbackFor = Exception.class(但是这样,默认的Error就被排除了,O(∩_∩)O)
@Transactional(rollbackFor = Exception.class) // Exception下所有异常回滚(不含Error)
public void businessMethod() throws Exception {
// 你的业务逻辑
}
在自己的理解和项目实战中,用默认的@Transactional就行,无需显示设置。
如果项目中如果需要手动抛出异常做回滚,自己封装一个继承于RuntimeException的异常进行抛出就行,从而触发事务。