zoukankan      html  css  js  c++  java
  • Spring事务的一些基本知识(二)关于方法A调用方法B

    总结:
    方法A调用方法B:
    1、如果只有A加@Transactional注解;则AB在同一事务中;
    2、如果只有B加@Transactional注解;AB方法为同一类,事务失效;AB不同类,只有B有事务;

    原理:
    spring 在扫描bean的时候会扫描方法上是否包含@Transactional注解,如果包含,spring会为这个bean动态地生成一个子类(即代理类,proxy),代理类是继承原来那个bean的。
    此时,当这个有注解的方法被调用的时候,实际上是由代理类来调用的,代理类在调用之前就会启动transaction。然而,如果这个有注解的方法是被同一个类中的其他方法调用的,那么该方法的调用并没有通过代理类,而是直接通过原来的那个bean,所以就不会启动transaction,我们看到的现象就是@Transactional注解无效。

    那回到一开始的问题,我们调用的方法A不带注解,因此代理类不开事务,而是直接调用目标对象的方法。当进入目标对象的方法后,执行的上下文已经变成目标对象本身了,因为目标对象的代码是我们自己写的,和事务没有半毛钱关系,此时你再调用带注解的方法,照样没有事务,只是一个普通的方法调用而已。
    简单来说,内部调用本类方法,不会再走代理了,所以B的事务不起作用。

    如果AB不同类,A调用的事代理类B,故B有事务。

    【原文链接】

    https://blog.csdn.net/weixin_36586564/article/details/105687331

    【后记】

      这篇文章是在遇到了事务方面的问题后查到的一个原理性解释,解释地通俗易懂,很快就能够理解为什么会出现事务不生效的问题,所以在这里专门转载记录。Spring管理事务中的注解@Transactional也不是魔法,它背后必定是有实现思路和逻辑的,如果了解了这个逻辑,基本上就能知道为什么很多时候@Transactional会失效。

  • 相关阅读:
    SQL易错总结1
    线程池使用总结
    多线程的上下文切换
    SQL 排序按指定内容优先排序
    System x 服务器制作ServerGuide U盘安装Windows Server 2008 操作系统 --不格式化盘
    错误“该伙伴事务管理器已经禁止了它对远程/网络事务的支持”解决方案
    sql server 2012 链接服务器不能链接sql server 2000的解决方案 ,
    sqlserver2005版本的mdf文件,还没有log文件,
    BCP SQL导出EXCEL常见问题及解决方法;数据导出存储过程
    Nginx
  • 原文地址:https://www.cnblogs.com/bruceChan0018/p/15737820.html
Copyright © 2011-2022 走看看