spring transaction
建议
Spring团队的建议是你在具体的类(或类的方法)上使用 @Transactional
注解,
而不要使用在类所要实现的任何接口上。你当然可以在接口上使用 @Transactional
注解,
但是这将只能当你设置了基于接口的代理时它才生效。
因为注解是不能继承的,
这就意味着如果你正在使用基于类的代理时,那么事务的设置将不能被基于类的代理所识别,
而且对象也将不会被事务代理所包装(将被确认为严重的)。
因此请接受Spring团队的建议并且在具体的类上使用 @Transactional
注解。
事务无法使用的可能原因
导入spring的事务注解
应该是 org.springframework.transaction.annotation.Transactional
而不是 javax.transaction.Transactional
是否开启了对注解的解析:
- xml 文件配置
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>
- springboot
注解开启自动扫描 @EnableTransactionManagement
spring是否扫描到你使用注解事务的这个类所在的包
- 配置xml
<context:component-scan base-package="com.xxx.xxx" ></context:component-scan>
- springboot 开启事务
@EnableTransactionManagement
数据库引擎要支持事务
如果是mysql,注意表要使用支持事务的引擎,比如InnoDB,如果是myisam,事务是不起作用的
springboot的配置
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
检查方法是不是public的
@Transactional
仅仅在public
方法,才能进行事务管理。
这是因为在使用 Spring AOP 代理时,
Spring 在调用在图中的 TransactionInterceptor 在目标方法执行前后进行拦截之前(图中是cglib代理)
DynamicAdvisedInterceptor(CglibAopProxy 的内部类)的的 interc