千家信息网

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

发表于:2025-12-01 作者:千家信息网编辑
千家信息网最后更新 2025年12月01日,前言Spring的声明式事务让我们不在编写获得连接、关闭连接、开启事务、提交事务、回滚事务等代码,通过一个简单的@Transactional注解,就让我们轻松进行事务处理。我们知道Spring事务基于
千家信息网最后更新 2025年12月01日分析动态代理给Spring事务埋下的坑

前言

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

从动态代理到Spring事务

UserService:

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

noTxMethod方法是普通方法

UserServiceImpl

在Spring事务中,我们往往是在Service层进行事务控制。

我们在UserServiceImpl中想模拟的是:

一个有事务的方法,去调用另一个有事务的方法,会怎么样?

一个没有事务的方法,去调用一个有事务的方法,会怎么样?

UserHandler

这里为了简便,通过方法名称来判断是否开启事务。

显然,txMethod方法、txMethod2方法都"应该"开启事务。

UserTest

下面,我们来说下运行结果:

proxyInstance.txMethod2()方法,会开启事务,这没有问题。

proxyInstance.txMethod()方法,虽然在事务方法txMethod()内部调用了txMethod2()事务方法,但是并没有新开启事务。

proxyInstance.noTxMethod()方法,虽然在没有事务的方法noTxMethod()内部调用了有事务的txMethod2()方法,但是并没有开启事务。

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

上述的情况,说白了,就是在一个Service内部,事务方法之间的嵌套调用,普通方法和事务方法之间的嵌套调用,都不会开启新的事务!

为什么会这样呢?

其实通过上面的动态代理的代码,你应该可以发现:

动态代理最终都是要调用原始对象的,而原始对象在去调用方法时,是不会再触发代理了!

那么如何解决呢?

很简单,我们完全可以在抽出一个XxxService,在其内部调用UserService.txMethod()和UserService.txMethod2()方法即可。总而言之,避免在一个Service内部进行事务方法的嵌套调用!(因为动态代理导致这种场景事务失效了。)

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

事务 方法 代理 动态 原始 普通 之间 代码 场景 对象 是在 分析 简便 茫然 说白了 前言 博客 原理 名称 实际 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 浙江网络安全排行 安信证劵app与服务器连接中断 数据库100万条数据内存多大 党建共建主题网络安全 拓超科技软件开发有限公司 计算机网络技术如何提升职业能力 气象局网络安全总结报告 戴尔服务器u盘装系统 华为帐号一直显示无法连接服务器 系统软件开发需要考什么证 网络安全和网络维护是一个工作吗 url如何存入数据库中 网络技术交流会开场白 sql展示数据库的代码 网络数据库的安全特性 网络安全八句诗 天津市皮卡丘网络技术 小凯互联网科技有限公司 山东超级服务器虚拟主机 日本软件开发工程师工资多少 上海百盛软件开发公司 戴尔r740服务器黄灯常亮 外包软件开发工作要求 雷兔跨境服务器不能适用国外 网络安全黑客人员 进行软件开发需要的物质准备 数据库如何删除一行 数据库中日期怎么比较大小 hive数据库主键 多功能软件开发答疑解惑
0