`
kakarot_java
  • 浏览: 163716 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

难经6:小心,SpringAOP声明式事务的一个缺陷

阅读更多
难经6:小心,SpringAOP声明式事务的一个缺陷
关键字: spring aop 事务 声明式
[问题]

       Spring的声明式事务,我想就不用多介绍了吧,一句话“自从用了Spring AOP啊,事务管理真轻松啊,真轻松;事务管理代码没有了,脑不酸了,手不痛了,一口气全配上了事务;轻量级,测试起来也简单,嘿!”。不管从哪个角度看,轻量级声明式事务都是一件解放生产力的大好事。所以,我们“一直用它”。



      不过,最近的一个项目里,却碰到了一个事务管理上的问题:有一个服务类,其一个声明了事务的方法,里面做了三次插入SQL操作,但是在后面出错回滚时,却发现前面插入成功了,也是说,这个声明了事务的方法,实际上并没有真正启动事务!怎么回事呢?难道Spring的声明式事务失效了?

      

[探幽]

     其实以前也会碰到有人说,Spring的事务配置不起作用,但是根据第一反应和以往经验,我总会告诉他,肯定是你的配置有问题啦;所以这一次,我想也不会例外,大概是把事务注解配在了接口上而不是实现方法上,或者,如果是用XML声明方式的话,很可能是切入点的表达式没有配对。



     不过,在检查了他们的配置后,却发现没有配置问题,该起事务的实现方法上,用了@Transactional事务注解声明,XML里也配了注解驱动<tx:annotation-driven .../>,配置很正确啊,怎么会不起作用?



     我很纳闷,于是往下问:

     问1:其他方法有这种情况么?

     答1:没有。

     问2:这个方法有什么特别的么(以下简称方法B)?

     答2:就是调后台插了三条记录啊,没啥特别的。

     问3:这个方法是从Web层直接调用的吧?

     答3:不是,是这个Service类(以下简称ServiceA)的另外一个方法调过来的(以下简称方法A)。

     问4:哦,那个调用它的方法配了事务么(问题可能在这了)?

     答4:没有。

     问5:那WEB层的Action(用的是Struts2),调用的是没有声明事务的方法A,方法A再调用声明了事务的方法B?

     答5:对的。

     问6:你直接在方法A上加上事务声明看看

     答6:好。。。

    

     看来可能找到问题所在了,于是把@Transactional也加在方法A上,启动项目测试,结果是:事务正常生效,方法A和方法B都在一个事务里了。



     好了,现在总结一下现象:

     1、ServiceA类为Web层的Action服务

     2、Action调用了ServiceA的方法A,而方法A没有声明事务(原因是方法A本身比较耗时而又不需要事务)

     3、ServiceA的方法A调用了自己的方法B,而方法B声明了事务,但是方法B的事务声明在这种情况失效了。

     4、如果在方法A上也声明事务,则在Action调用方法A时,事务生效,而方法B则自动参与了这个事务。



       我让他先把A也加上事务声明,决定回来自己再测一下。

     

       这个问题,表面上是事务声明失效的问题,实质上很可能是Spring的AOP机制实现角度的问题。我想到很久以前研究Spring的AOP实现时发现的一个现象:对于以Cglib方式增强的AOP目标类,会创建两个对象,一个事Bean实例本身,一个是Cglib增强代理对象,而不仅仅是只有后者。我曾经疑惑过这一点,但当时没有再仔细探究下去。

     

      我们知道,Spring的AOP实现方式有两种:1、Java代理方式;2、Cglib动态增强方式,这两种方式在Spring中是可以无缝自由切换的。Java代理方式的优点是不依赖第三方jar包,缺点是不能代理类,只能代理接口。



      Spring通过AopProxy接口,抽象了这两种实现,实现了一致的AOP方式:







      现在看来,这种抽象同样带了一个缺陷,那就是抹杀了Cglib能够直接创建普通类的增强子类的能力,Spring相当于把Cglib动态生成的子类,当普通的代理类了,这也是为什么会创建两个对象的原因。下图显示了Spring的AOP代理类的实际调用过程:



    

    



      因此,从上面的分析可以看出,methodB没有被AopProxy通知到,导致最终结果是:被Spring的AOP增强的类,在同一个类的内部方法调用时,其被调用方法上的增强通知将不起作用。

    

      而这种结果,会造成什么影响呢:

      1:内部调用时,被调用方法的事务声明将不起作用

      2:换句话说,你在某个方法上声明它需要事务的时候,如果这个类还有其他开发者,你将不能保证这个方法真的会在事务环境中

      3:再换句话说,Spring的事务传播策略在内部方法调用时将不起作用。不管你希望某个方法需要单独事务,是RequiresNew,还是要嵌套事务,要Nested,等等,统统不起作用。

      4:不仅仅是事务通知,所有你自己利用Spring实现的AOP通知,都会受到同样限制。。。。



[解难]

     

      问题的原因已经找到,其实,我理想中的AOP实现,应该是下面这样:

     

    

     

      只要一个Cglib增强对象就好,对于Java代理方式,我的选择是毫不犹豫的抛弃。



      至于前面的事务问题,只要避开Spring目前的AOP实现上的限制,要么都声明要事务,要么分开成两个类,要么直接在方法里使用编程式事务,那么一切OK。

分享到:
评论

相关推荐

    难经3:Struts2,拦截器拦不住Result?

    ”揭示了这是一个关于Struts2框架中拦截器(Interceptor)与结果(Result)交互问题的讨论。在Struts2框架中,拦截器是实现业务逻辑和控制逻辑之间解耦的重要机制,而Result则负责处理动作(Action)执行后的返回...

    先秦至三国时期的医学文献.docx

    先秦至三国时期的医学文献记录了这一时期对各种疾病的认识,包括睡眠障碍。这段时期的医学主要体现在马王堆汉墓出土的医书以及《内经》、《难经》等经典著作中。以下是对这些文献中相关知识点的详细阐述: 1. ...

    2019年安徽屯溪区个体经济发展服务中心招聘模拟试题及答案解析.docx

    2. 硅胶干燥剂:硅胶干燥剂是一种常用的吸湿材料,当其吸收到水分后,会发生颜色变化,通常会从蓝色变为粉红色,以指示吸湿程度。 3. 刑罚与犯罪的关系:犯罪是刑罚的前提,没有犯罪就不存在适用刑罚的必要。刑罚是...

    主治医师 (中医全科学)-肺系病证(A1型题 2).doc

    《难经》:未明确提出肺痈。 - C. 《金匮要略》:正确选项。“肺痈”病名首见于此书。 - D. 《伤寒论》:未明确提出肺痈。 - E. 《诸病源候论》:对多种疾病病因进行了论述。 **答案**:C. 《金匮要略》 #### ...

    精品资料(2021-2022年收藏)浙江省医疗卫生招聘公共基础知识考试试题.docx

    8. 脉学论述:《难经》对脉学有较详细的论述和创见,是中医经典之一。 9. 四步触诊法:第三步触诊能间接推算妊娠月份,可感知胎头、胎背、胎产式等。 10. 严重不良反应药品的控制:药品监督管理部门有权采取停止...

    南通大学2019年招聘模拟试题及答案解析.docx

    当劳动合同订立时所依据的客观情况发生重大变化,导致合同无法履行时,用人单位需与劳动者协商变更合同,若双方无法达成一致,用人单位可解除劳动合同,但需提前三十日以书面形式通知劳动者或额外支付一个月工资。...

    2022年中医执业医师考试复习资料完全版归纳.docx

    4. **咳嗽定义**:在中医内科中,咳嗽既是一个单一病种,也包含了西医多种疾病的表现。 5. **病理因素**:内伤咳嗽的基本病理因素是痰和火(注意与脏腑失调病因的区别)。 ### 三、哮与喘 1. **哮的定义**:始见于...

    中医研修会10月份工作计划.doc

    一、引言 中医,作为中华民族的瑰宝,历史悠久,理论体系博大精深。10月份的中医经典研修会旨在深入挖掘中医理论,提升会员对中医经典的理解与应用能力,推动中医药文化的传承与发展。 二、活动目标 1. 提升会员对...

    2019浙江余杭区仁和街道招聘巡防队员试题及答案解析.docx

    - **《难经》**:以问答形式编撰,讨论了81个医学难题,假说是战国时期秦越人(扁鹊)所作。 ### 4. 社会公正的概念 - **定义**:社会公正是社会成员对于社会是否“合意”的一种价值判断,实质上要求权利与义务在...

    胡希恕金匮要略讲座.docx

    7. 《难经》的理论借鉴:治疗思路受到《难经》的影响,如“西方实、东方虚,补南方、泻北方”的原则,通过调整心火和肾水的关系,以达到治疗目的。 这些知识点展示了中医临床诊疗的独特观念和方法,强调了整体观念...

    2019年广西崇左市国土资源局招聘模拟试题及答案解析.docx

    3. 公文写作规范:在公文写作中,通常只主送一个上级机关,如果确实需要同时主送两个及以上,应用“并报”字样,而不是顿号。 4. 中国地理与河流:长江是中国的重要水系,被誉为“黄金水道”,因其航运价值高,对...

    中医耳鼻喉科(医学高级)-多项选择(精选试题).doc

    中医耳鼻喉科学是传统医学的一个重要分支,主要研究和治疗耳、鼻、喉等相关疾病的学科。这份医学高级多项选择试题涵盖了该领域的多个知识点,包括疾病鉴别、症状分析、经络理论以及脏腑功能与五官的关系。 1. 口疮...

    中医基础理论练习总习题.doc

    《中医基础理论练习总习题.doc》是一份关于中医基础知识的综合练习材料,涵盖了中医学导论中的核心概念和历史发展。以下是对其中知识点的详细解释: 1. **中医学及中医学理论体系**:中医学是中国传统医学,理论...

    中医诊断学复习要点.doc

    - 问诊:包括问寒热、问汗、问疼痛、问头身胸腹、问耳目、问睡眠、问饮食口味、问二便、问经带等,每一方面都涉及到特定的临床意义和症状分析。 - 望诊:全身望诊关注病人的精神状态、面色、形体、姿态等,局部...

    2016年上半年浙江省医疗卫生招聘公共基础知识考试题.pdf

    6. 下颌中切牙的鉴别:通过牙根远中面的长形凹陷等特征来判断左右。 7. 清虚热兼有利尿通淋功效的药物:白薇具有这样的功效,常用于治疗热病后期的虚热和尿路问题。 8. 破伤风的治疗:关键是清除毒素来源、中和...

    山东省枣庄市2012年秋七年级历史上册《第8课中华文化的勃兴(一)》教案 新人教版.doc

    【标题】和【描述】提及的是七年级历史课程的一个教案,主要探讨了中华文化的勃兴这一主题,特别是关于古代文字、文学、科技和文化成就的内容。以下是对这些知识点的详细阐述: 1. **古代文字的发展**: - **甲骨...

    2019浙江卫视招聘综艺、采编、营销等专业人员试题及答案解析.docx

    这些知识点涵盖了医学历史、企业管理、网络技术应用、社会保障法规以及职业道德等多个领域,都是招聘综艺、采编、营销等专业人员时可能会涉及的综合知识。对于应聘者来说,了解并掌握这些知识有助于提升自身的综合...

    七年级历史10月月考试题.doc

    5. 春秋战国时期的名医:扁鹊是春秋战国之际的著名医生,以其高超的医术和医学理论而著称,是中医四大经典之一《难经》的作者。 6. 黄帝与华夏族:黄帝被尊称为人文初祖,他的部落与炎帝部落结盟,形成了华夏族的...

    安徽省特种设备检测院招考聘用强化练习卷含答案.doc

    6. 医学历史与经典:《黄帝内经》《难经》《伤寒杂病论》《神农本草经》是中医四大经典,对传统医学有着深远影响。华佗是东汉时期的名医,被誉为"外科鼻祖",而李时珍编写的《本草纲目》是一部中药学巨著,但他并非...

Global site tag (gtag.js) - Google Analytics