当使用 @Transactional 注解的方法中抛出不受检查的异常(非 RuntimeException 或其子类)时,Spring 将默认不回滚事务。以下是代码案例。
@Service
public class MyNonRollbackService {
@Transactional
public void performNonRollbackOperation() throws Exception {
// 此方法中的非运行时异常将不触发事务回滚
doDatabaseOperation();
throw new Exception("Simulating a checked exception");
}
private void doDatabaseOperation() {
// 这里执行数据库操作
}
}
在这个例子中,performNonRollbackOperation 方法上使用了 @Transactional 注解。当方法执行时,如果 doDatabaseOperation 方法或者 performNonRollbackOperation 方法中抛出的异常是非运行时异常,整个事务将不会回滚。类似非运行时异常中IOException、SQLException、ClassNotFoundException等等都会默认不回滚,要想解决该问题最简单的方式是@Transactional(rollbackFor = Exception.class)去指定异常从而回滚。