声明式事务@Transactional失效场景
1、数据库引擎设置不对造成的。
说明:比如我们最常用的mysql,引擎MyISAM,是不支持事务操作的。需要改成InnoDB才能支持。
2、入口的方法必须是public,否则事务不起作用。
说明:这一点由Spring的AOP特性决定的,理论上而言,不public也能切入,但spring可能是觉得private自己用的方法,应该自己控制,不应该用事务切进去吧)。另外private 方法, final 方法 和 static 方法不能添加事务,加了也不生效。
3、Spring的事务管理默认只对出现运行期异常(java.lang.RuntimeException及其子类)进行回滚
说明:为什么spring要这么设计?因为spring认为Checked的异常属于业务的,coder需要给出解决方案而不应该直接扔该框架。
4、类是否被代理了
说明:因为spring的事务实现原理为AOP,只有通过代理对象调用方法才能被拦截,事务才能生效。
Spring Boot 使用事务非常简单,首先使用注解 @EnableTransactionManagement 开启事务支持后,然后在访问数据库的Service方法上添加注解 @Transactional 便可。
@EnableTransactionManagement 等同于xml配置方式的 <tx:annotation-driven />