差点中招-事务失效

2023-04-15  本文已影响0人  M_lear

一个spring bean中的方法加了Transactional注解,spring会为这个bean实例再创建一个代理对象,代理对象持有这个bean的引用。
当其他对象需要注入这个spring bean时,实际上注入的是这个bean的代理对象,这样spring事务就会生效。

差点中招

@Component
public class A {
    @Scheduled(fixedRate = 3000)
    public void doJob() {
        handleExpiredOrder();
    }

    @Transactional(rollbackFor = Exception.class)
    void handleExpiredOrder() {
    }
}

上面这段代码的意图是,创建一个3s运行一次的spring定时任务,这个定时任务去调用被Transactional注解修饰的handleExpiredOrder方法。
这种情况spring事务是不会生效的,因为doJob调用的是A实例的handleExpiredOrder方法,而不是A实例代理对象的handleExpiredOrder方法。

应该这样

@Component
public class OrderService {
    @Transactional(rollbackFor = Exception.class)
    public void handleExpiredOrder() {
    }
}

@Component
public class A {
    @Autowired
    private OrderService orderService;

    @Scheduled(fixedRate = 3000)
    public void doJob() {
        orderService.handleExpiredOrder();
    }
}

把事务代码移到一个单独的类中,通过spring注入的对象调用事务方法。

上一篇下一篇

猜你喜欢

热点阅读