美文网首页
spring事务@Transactional在同一个类中的方法调

spring事务@Transactional在同一个类中的方法调

作者: 许武顺 | 来源:发表于2017-02-14 14:17 被阅读10472次

    spring提供了非常强大的事务管理机制,之前一直以为只要在想要加注解的方法上加个@Transactional注解就万事大吉了

    但是今天发现这样做在某些情况下会有bug,导致事务无法生效。

    当这个方法被同一个类调用的时候,spring无法将这个方法加到事务管理中。

    我们来看一下生效时候和不生效时候调用堆栈日志的对比。

    通过对比两个调用堆栈可以看出,spring的@Transactional事务生效的一个前提是进行方法调用前经过拦截器TransactionInterceptor,也就是说只有通过TransactionInterceptor拦截器的方法才会被加入到spring事务管理中,查看spring源码可以看到,在AdvisedSupport.getInterceptorsAndDynamicInterceptionAdvice方法中会从调用方法中获取@Transactional注解,如果有该注解,则启用事务,否则不启用。

    这个方法是通过spring的AOP类CglibAopProxy的内部类DynamicAdvisedInterceptor调用的,而DynamicAdvisedInterceptor继承了MethodInterceptor,用于拦截方法调用,并从中获取调用链。

    如果是在同一个类中的方法调用,则不会被方法拦截器拦截到,因此事务不会起作用,必须将方法放入另一个类,并且该类通过spring注入。

    相关文章

      网友评论

          本文标题:spring事务@Transactional在同一个类中的方法调

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