spring @Transactional 事务无法使用的可能原因

本文探讨了Spring @Transactional事务可能无法工作的原因,包括:注解使用位置不当、未开启注解解析、扫描包配置错误、数据库引擎不支持事务、方法访问权限不足、异常类型错误、异常被捕获以及Spring AOP的自调用问题。建议遵循最佳实践,并对遇到的问题进行排查。
摘要由CSDN通过智能技术生成

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 方法,才能进行事务管理。

photo_1

这是因为在使用 Spring AOP 代理时,
Spring 在调用在图中的 TransactionInterceptor 在目标方法执行前后进行拦截之前(图中是cglib代理)

DynamicAdvisedInterceptor(CglibAopProxy 的内部类)的的 interc

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值