排坑之旅——动态代理给Spring事务种下的坑

栏目: Java · 发布时间: 7年前

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

前言

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

从动态代理到Spring事务

UserService:

排坑之旅——动态代理给Spring事务种下的坑

UserService接口

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

noTxMethod方法是普通方法

UserServiceImpl:

排坑之旅——动态代理给Spring事务种下的坑

UserServiceImpl

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

我们在UserServiceImpl中想模拟的是:

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

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

UserHandler:

排坑之旅——动态代理给Spring事务种下的坑

UserHandler

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

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

UserTest:

排坑之旅——动态代理给Spring事务种下的坑

UserTest

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

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

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

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

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

排坑之旅——动态代理给Spring事务种下的坑

Spring事务

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

为什么会这样呢?

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

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

那么如何解决呢?

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

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


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

iOS编程实战

iOS编程实战

[美] Rob Napier、[美] Mugunth Kumar / 美团移动 / 人民邮电出版社 / 2014-9 / 79.00元

本书深入介绍iOS 7新特性和新功能,涵盖iOS 7大部分新增特性,包括新的后台操作、Core Bluetooth、UIKit动力学以及TextKit。另外还介绍了如何处理新的扁平化UI,并新增了一章你可能不知道的“小技巧”。如果读者熟练掌握C和C++,读完本书即可创建性能优异的iPhone、iPad和iPod touch应用。 本书主要内容包括:  iOS 7新特性和新功能概览; ......一起来看看 《iOS编程实战》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

随机密码生成器
随机密码生成器

多种字符组合密码

html转js在线工具
html转js在线工具

html转js在线工具