@transactional(norollbackfor = busiexception.class) 表示抛出 busiexception 或其子类时事务不回滚而提交;需确保该异常是 runtimeexception 或已声明 throws,且注解用于 public 方法并由 spring 代理调用。

在 Java 的 Spring 框架中,@Transactional(noRollbackFor = BusiException.class) 的作用是:当方法抛出 BusiException 类型(或其子类)异常时,事务**不自动回滚**,而是继续提交。
确保 BusiException 是 RuntimeException 或已声明在 throws 中
Spring 默认只对 未检查异常(RuntimeException 及其子类) 和 Error 回滚;对检查异常(checked exception)默认不回滚。所以:
- 如果
BusiException继承自RuntimeException,它本就会触发回滚 —— 此时加noRollbackFor才有意义,告诉 Spring “别回滚”; - 如果
BusiException是 checked exception(比如继承自Exception),默认就不回滚,此时noRollbackFor实际上是冗余的(但加上也不影响); - 若想让 checked exception 也触发回滚,需显式写
rollbackFor = BusiException.class;反之,用noRollbackFor就是“排除”它。
正确声明注解位置和传播行为
@Transactional 必须作用于 public 方法,且该方法需由 Spring 代理调用(不能 this. 直接调用):
- 错误写法:
this.serviceMethod()→ 绕过代理,事务失效; - 正确写法:通过注入的 Bean 调用,或使用
AopContext.currentProxy()(不推荐); - 确保类被 Spring 管理(如加
@Service),且启用了事务支持(@EnableTransactionManagement)。
注意异常类型匹配规则
noRollbackFor 支持数组,可指定多个异常;它匹配的是异常实例的运行时类型**,而非抛出位置:
- 若方法抛出
BusiException,满足条件,不回滚; - 若抛出其子类(如
OrderBusiException extends BusiException),也匹配,同样不回滚; - 若抛出其他异常(如
RuntimeException),仍按默认规则回滚(除非也加入noRollbackFor)。
验证是否生效的小技巧
可在方法内故意插入一条数据库插入语句,再抛出 BusiException,观察数据是否保留在库中:
- 保留 →
noRollbackFor生效; - 消失 → 检查异常类型、代理调用、事务配置是否正确;
- 也可开启日志:
logging.level.org.springframework.transaction=DEBUG,查看事务提交/回滚决策日志。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











