spring 事务没生效的几个注意点

spring声明式事务,不是写上@Transactional 就可以生成事务,还是需要注意:1. 方法必须是public的;2. 类内部调用,一个没有事务的方法调用一个有事务注解的方法,事务不生效;3. 注解最好在具体的类上,在接口上不行。我遇到的就是前两个条件。

写代码,写了事务,让一堆插入更新在一个事务内,以为可以放心了,但是出了bug,前面执行失败,后面的sql还是继续执行。查过之后才发现,事务没有生效。明明写了@Transactional注解,怎么没有事务呢?百度了一下,才知道,方法必须是public的,

参考 https://juejin.im/post/5c6b71c4f265da2dc231dcbf  。

另外一个,不能类内调用。写的其他事务都生效,怎么这个不生效?排除各种配置问题,发现是一个方法调用另一个方法时,不生效。解决方法目前找到: 把 需要事务的方法,再写一个类放进去;使用代理对象。

类内调用不生效的原因 参考 https://www.cnblogs.com/softidea/p/5962597.html  , https://segmentfault.com/a/1190000011440783 。

使用代理对象的方法:

    例如 类内,A方法调用B方法,A没有事务,B需要事务,那么在调用B方法的时候,((ClassName) AopContext.currentProxy()).B() 。

这时可以代理到,但是还是有点问题:java.lang.IllegalStateException: Cannot find current proxy: Set 'exposeProxy' property on Advised to 'true' to make it available.   需要在事务注解配置中,加配置 <aop:aspectj-autoproxy expose-proxy="true"/>。事务就可以生效啦。

另一个问题:我的是在 afterSuccess 这种拦截调用中,也有使用。虽然被调用的方法也在一个类内,但是拦截是在别的地方,应该是不一样的场景,但是开始写的时候,都给写上了 ((ClassName) AopContext.currentProxy()).B(),同样是报错:Cannot find current proxy: Set 'exposeProxy' property on Advised to 'true' to make it available 。 这个是不用写但是多写了,也是会报错。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值