为了账号安全,请及时绑定邮箱和手机立即绑定

@Transactional(propagation = Propagation.REQUIRES_NEW)失效问题

同一个类中,方法调用 ,即便是加了@Transactional(propagation = Propagation.REQUIRES_NEW),也没有效果,A方法调用B方法;A方法出问题,B方法同样会回滚,老师这个有好的解决法么?

正在回答

5 回答

自事务调用失效

0 回复 有任何疑惑可以回复我~

用户1148976的回答是正解,orderService要有generateOrderNo()接口,然后orderServiceImpl实现该接口,然后orderServiceImpl内部注入orderService,使用orderService.generateOrderNo()来调用,用this调用是无效的

2 回复 有任何疑惑可以回复我~
#1

少年啊c

老师这个是错的?
2019-08-03 回复 有任何疑惑可以回复我~
#2

慕粉1471311418 回复 少年啊c

可能是
2020-04-10 回复 有任何疑惑可以回复我~

要使得@Transactional生效,必须通过JDK动态代理或者CGLIB来调用B方法,而不能直接在A方法中调用B方法,

这里可以在OrderServiceImpl中注入自身:

@Autowired
private OrderService orderService;

在createOrder()方法中这样调用:

orderModel.setId(orderService.generateOrderNo());

当然,generateOrderNo()方法要改成public,OrderService接口中也要申明下generateOrderNo()方法。

5 回复 有任何疑惑可以回复我~

不管怎么样,应该不是a、b方法不能在同一类中的原因,可能是因为调用代理对象的不同导致的新的(b方法的)事务未开启,

0 回复 有任何疑惑可以回复我~

把被标注的方法前的private修饰符去掉试试

0 回复 有任何疑惑可以回复我~
#1

慕粉13146578634 提问者

我试了,也不行呢,我把B方法单独写到另一个类里面,通过注入B方法所在的类,然后在A方法中调用B方法,就可以了。也就是说,要使@Transactional(propagation = Propagation.REQUIRES_NEW)有效,A和B方法,最好不要在同一个类中?
2019-01-17 回复 有任何疑惑可以回复我~
#2

dusty_z 回复 慕粉13146578634 提问者

你看看你的类上是不是加了@Transactional,如果是的话,去掉。应该是在a方法上添加@Transactional,b方法上添加@Transactional(propagation = Propagation.REQUIRES_NEW)
2019-01-17 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

@Transactional(propagation = Propagation.REQUIRES_NEW)失效问题

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信