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

zhoudatong 2018-12-06 原文

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

前言

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事务如此简单,但是背后却有这些道道,你被坑过么?

发表于 2018-12-06 17:05 神一样的编程 阅读() 评论() 编辑 收藏

 

版权声明:本文为zhoudatong原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/zhoudatong/p/10077785.html

分析动态代理给Spring事务埋下的坑的更多相关文章

  1. spring boot 整合 ehcache

    1. 该说的话 每个人都应当学会独立地去思考、去寻找答案,而不是一味地伸手向他人索取所谓的标准答案。 首先,别 […]...

  2. spring boot 中统一异常处理

    什么是异常? 通俗的说就是,让你感觉不爽的,阻碍你的事都算异常,也就是说不让我们程序正常运行的情况。 为什么要 […]...

  3. 你的项目应当使用Spring Boot吗?(译文)

    注:这是一篇译文,参考链接:https://www.e4developer.com/2018/09/24/sh […]...

  4. Spring Boot (二) 整合 Redis

    前言 本文将会基于 springboot 2.1.8.RELEASE 简单整合 Redis ,适合新手小白入门 […]...

  5. Spring Cloud gateway 七 Sentinel 注解方式使用

    Sentinel 注解支持 @SentinelResource 用于定义资源,并提供可选的异常处理和 fall […]...

  6. Spring Boot Actutaur + Telegraf + InFluxDB + Grafana

    监控平台 完成一套精准,漂亮图形化监控系统从这里开始第一步   Telegraf是收集和报告指标和数据的代理 […]...

  7. spring-boot-2.0.3不一样系列之番外篇 – @Configuration、Condition与@Conditional

    前言   开心一刻    一名劫匪慌忙中窜上了一辆车的后座,上车后发现主驾和副驾的一男一女疑惑地回头看着他,他 […]...

  8. Spring Boot Actuator H2 RCE复现

    0x00 前言 Spring Boot框架是最流行的基于Java的微服务框架之一,可帮助开发人员快速轻松地部署 […]...

随机推荐

  1. [VC/Win32] Win7/8/8.1/10修改文件|注册表|进程令牌权限,解除TrustedInstaller权限限制

    修改权限,解除TrustedInstaller权限限制 Win7/8/8.1/10系统注册表和C盘里的文件大多 […]...

  2. CSS字体样式

    1 color 字体颜色 定义元素内文字颜色。 语法:color:颜色名|十六进制|RGB color属性用于 […]...

  3. [第五组]用例文档+功能说明书+技术说明书

    用例文档 标题:趣味决策功能的实现 角色:使用HK软件的用户。 主要成功场景: 1.用户点击HK软件登录之后进 […]...

  4. Linux服务器—DansGuardian

    DansGuardian DansGuardian可以限制客户端的访问,通过这个软件,我们可以限制哪些网站不可 […]...

  5. display:box属性

    在移动端开发的时候,圣杯布局,弹性盒,是我们经常会用得到的,现在css3新增了一个与flex相似功能的属性di […]...

  6. AI行为树的工作原理

    最近在项目中应用到了行为树,在网上看了不少关于行为树的文章,其中有一篇文章我觉得写得非常到位,它的原文是英文。 […]...

  7. SpringBoot入门之基于XML的Mybatis

    上一博客介绍了下SpringBoot基于注解引入Mybatis,今天介绍基于XML引入Mybatis。还是在上 […]...

  8. 微信小程序下拉选择器(反UI的产品设计)

    微信小程序下拉选择器(反UI的产品设计) 产品居然在小程序中使用了 web 的下拉框设计…行吧,简 […]...

展开目录

目录导航