美文网首页
差点中招-事务失效

差点中招-事务失效

作者: M_lear | 来源:发表于2023-04-15 10:14 被阅读0次

    一个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注入的对象调用事务方法。

    相关文章

      网友评论

          本文标题:差点中招-事务失效

          本文链接:https://www.haomeiwen.com/subject/yvhxjdtx.html