Java中级项目中异常回滚依赖事务机制自动完成,需满足三要素:异常传播出去、事务配置正确、数据源支持事务;@Transactional仅对public方法生效,且必须由Spring代理调用,只对RuntimeException和Error默认回滚,受检异常需显式指定rollbackFor,数据库须用InnoDB等支持事务的引擎,非DB操作需手动补偿。
Java中级项目中,异常回滚不是靠“手动写代码撤回操作”,而是依赖事务管理机制自动完成的——关键在于让异常真正传播出去、事务配置正确、数据源支持事务。
Spring的声明式事务(@Transactional)基于AOP代理实现。如果方法是private、protected、或在同一个类里直接调用(this.method()),事务注解不会生效,异常发生时也不会回滚。
@Transactional默认只在遇到未捕获的RuntimeException及其子类、或Error时触发回滚。如果catch了异常又没重新抛出,或者抛出的是Exception(如IOException、SQLException),事务将正常提交。
即使代码写了@Transactional,若底层数据源不支持事务(如H2内存模式配成non-transactional)、或用了JdbcTemplate但未绑定到事务连接、或混用了JPA/Hibernate与原生JDBC却没共用同一DataSource,回滚也会失效。
)发邮件、写文件、调用第三方HTTP接口等操作不在数据库事务范围内。一旦这些操作成功而后续DB操作失败,就会出现数据不一致。
事务不是万能开关,它只管住你交给它的那一段数据库操作。回滚能否生效,取决于异常有没有逃出事务边界、容器有没有真正接管、底层有没有能力回退——三者缺一不可。