前言

Spring的声明式事务让我们不在编写获得连接、关闭连接、开启事务、提交事务、回滚事务等代码,通过一个简单的@Transactional注解,就让我们轻松进行事务处理。我们知道Spring事务基于AOP,采用动态代理实现,虽然使用简单,但是在实际场景中,我们也会遇到一些坑。而往往遇到坑之后,我们都会茫然,这是由于没有对Spring事务的实现机制做一点了解导致的。因此本篇博客将从原理的角度分析下动态代理给Spring事务埋下的坑!

从动态代理到Spring事务

UserService:

UserService接口

txMethod和txMethod2方法模拟事务方法(相当于@Transactional) noTxMethod方法是普通方法

UserServiceImpl:

UserServiceImpl

在Spring事务中,我们往往是在Service层进行事务控制。 我们在UserServiceImpl中想模拟的是:一个有事务的方法,去调用另一个有事务的方法,会怎么样?一个没有事务的方法,去调用一个有事务的方法,会怎么样?

UserHandler:

UserHandler

这里为了简便,通过方法名称来判断是否开启事务。显然,txMethod方法、txMethod2方法都“应该”开启事务。

UserTest:

UserTest

下面,我们来说下运行结果:proxyInstance.txMethod2()方法,会开启事务,这没有问题。proxyInstance.txMethod()方法,虽然在事务方法txMethod()内部调用了txMethod2()事务方法,但是并没有新开启事务。proxyInstance.noTxMethod()方法,虽然在没有事务的方法noTxMethod()内部调用了有事务的txMethod2()方法,但是并没有开启事务。

下面让我们来对应下Spring事务中的现象:

Spring事务

上述的情况,说白了,就是在一个Service内部,事务方法之间的嵌套调用,普通方法和事务方法之间的嵌套调用,都不会开启新的事务! 为什么会这样呢? 其实通过上面的动态代理的代码,你应该可以发现:动态代理最终都是要调用原始对象的,而原始对象在去调用方法时,是不会再触发代理了!那么如何解决呢?很简单,我们完全可以在抽出一个XxxService,在其内部调用UserService.txMethod()和UserService.txMethod2()方法即可。总而言之,避免在一个Service内部进行事务方法的嵌套调用!(因为动态代理导致这种场景事务失效了。)

好像Spring事务如此简单,但是背后却有这些道道,你被坑过么?

spring 动态代理_分析动态代理给 Spring 事务埋下的坑相关推荐

  1. 分析动态代理给Spring事务埋下的坑

    前言 Spring的声明式事务让我们不在编写获得连接.关闭连接.开启事务.提交事务.回滚事务等代码,通过一个简单的@Transactional注解,就让我们轻松进行事务处理.我们知道Spring事务基 ...

  2. (转)面试必备技能:JDK动态代理给Spring事务埋下的坑!

    一.场景分析 最近做项目遇到了一个很奇怪的问题,大致的业务场景是这样的:我们首先设定两个事务,事务parent和事务child,在Controller里边同时调用这两个方法,示例代码如下: 1.场景A ...

  3. Spring AOP 源码分析 - 创建代理对象

    1.简介 在上一篇文章中,我分析了 Spring 是如何为目标 bean 筛选合适的通知器的.现在通知器选好了,接下来就要通过代理的方式将通知器(Advisor)所持有的通知(Advice)织入到 b ...

  4. 云服务器代理_虚拟主机代理_服务器代理-谈谈IDC加盟合作那些事!

    云服务器代理_虚拟主机代理_服务器代理-谈谈IDC加盟合作那些事! 在互联网和大数据时代,云服务器简单高效.安全可靠,弹性扩展,节省IT运维成本等优势受到客户青睐:无论是企业还是个人应用,越来越多的I ...

  5. Spring AOP源码分析(四)Spring AOP的JDK动态代理

    2019独角兽企业重金招聘Python工程师标准>>> 本篇文章将会介绍上一个例子中的源码执行情况,从中熟悉整个SpringAOP的一些概念和接口设计. 首先整个SpringAOP的 ...

  6. 虚拟机 全局代理 主机代理_比较虚拟代理与真实代理的性能

    云计算的关键基础是虚拟化. 面向云的设计人员,开发人员和管理员需要问自己的一个问题是:"虚拟化组件的性能水平如何与其"真实"物理对应物相提并论?" " ...

  7. java 动态图表_【动态演示】3个套路带你玩转Excel动态图表!

    在这篇教程中,为大家分享Excel动态图表的三个套路,毕竟自古套路得人心啊. 1 辅助数据和复选框的结合 先看最终效果: 动态折线图 操作步骤 (1)新建辅助数据表,在B18单元格输入公式=IF(B$ ...

  8. spring boot框架_探索微框架:Spring Boot

    spring boot框架 Spring Boot是Pivotal团队的全新框架,旨在简化新Spring应用程序的引导和开发. 该框架采用了自以为是的配置方法,使开发人员无需定义样板配置. 这样一来, ...

  9. redis spring 切面缓存_今日份学习: Spring中使用AOP并实现redis缓存?

    笔记 在Spring中如何使用AOP? Spring是如何切换JDK动态代理和CGLIB的? spring.aop.proxy-target-class=true (在下方第二个链接中,原生doc中提 ...

最新文章

  1. Linux环境中Visual Studio Code的配置使用----编译运行C/C++(良心教程)
  2. 榜单|新冠病毒席卷全球,世界医疗水平大比拼
  3. F7-Vue1.0与2.0不兼容列表
  4. ArrayList中remove方法和set(null)的区别
  5. 查询存在表1但不存在表2的所有数据
  6. Dubbo的发展历史
  7. 计算机有哪两种绘图,能被计算机接受的数字图像有哪两种?它们分别由什么构成?...
  8. 诗与远方:无题(二十一)
  9. 再谈几种语言的运行速度比较:看第三方比较结论!
  10. AS5040磁编码器使用笔记
  11. Jmeter进行上传图片接口测试
  12. 循环优化与多面体模型
  13. 2022年9月电子学会Python等级考试试卷(五级)答案解析
  14. 使用伪类实现划掉字体
  15. 专访商汤科技联合创始人林达华丨一名AI人才,需要多少栽培?
  16. 基于EasyNVR实现RTSP_Onvif监控摄像头Web无插件化直播监控之视频直播网络占用率大如何解决的问题分析
  17. 我画了近百张图来理解红黑树
  18. Axure制作微信APP原型(三):消息+个人模块----聊天、浮窗、登录设备、个人主页、更多信息
  19. python递归算法(斐波那契数列,汉诺塔、二分法查找)
  20. 高德地图-实现地图搜索点选位置功能

热门文章

  1. WePY:在质疑中前进 | 文末福利
  2. BZOJ5093图的价值(斯特林数)
  3. WPFの操作文件浏览框几种方式
  4. exchange 删除邮件
  5. 点击出现黑色背景的解决
  6. 关于window.history.back()后退问题
  7. 仿ISQL功能的实现,可以实现批处理功能
  8. java创建方法并引用_java – 创建非捕获方法引用,它将调用超类方法
  9. 2017计算机三级哪个好考,快速突破2017年计算机三级考试的几大复习阶段
  10. linux修改组的选项名字为,Linux用户、组及权限管理浅析