spring事务管理实现原理-源码-传播属性
本博客分为两点,
一个是spring事务实现原理源码解读(个人能力,初步解读),
二是spring事务的传播属性
简单案例,保存订单,修改商品数量


就是这两个方法,第一个方法中引用了第二个方法,都用@Transactional注解。debug调用shopping方法。
spring事务实现的源码
在调用方法时会扫描@Transactional,进入方法前会判断是否有注解(在类上也会扫描到,具体扫描方式不是本博客重点)
接着debug这个test方法,会产生proxy的代理

进入proxy(动态代理)

也就是说通过AOP,在进入具体的方法之前,对方法进行了增强,具体增强什么,看下文。
在这个代理里面,实际做事情的是这个判断后的方法(前面都是一些判断),invocation的proceed()方法;
注:这里的invocation可以找到真正要调用的方法。

点进去看一下,重点是这个,invoke()方法,点进去
注;吐槽下,有的时候看源码就是一直点下去,但是不能忘了从哪里来,和最终目的,可以对着实际代码点进去看下,有点头大了。

继续点进去看下

好了,这个是重点,这个invokeWithTransaction方法做了很多事情,点进去看下

这个方法createTransactionIfNecessary()等会儿说(在spring的传播属性里面讲),看下面的try catch

你点点点就会到反射到具体的方法,这个时候就会调用真正的方法,
所以这个方法已经被增强了,
有了异常会回滚,在catch里面,而且会throw出去(这里的抛出有讲究,上家公司就是这么处理事务的,要求自己对业务进行try catch手动编程)。
没有异常,就走下面的提交(具体的自己点进去看)
这就是大致的spring的事务实现,若有兴趣,可看下spring事务的传播属性
===========================================================================
spring事务的传播属性
好的,上面我说的createTransactionIfNecessary(),在这里说,

重点是这个接口里面的getTransaction()方法,很重要,跟进去,去实现里找到如下:

判断当前环境是否已经存在事务,有事务走里面方法,没有事务走外面继续走;
继续走,进行很多判断,这里就要说注解@Transactional的信息,重点关注propagation(传播行为)和isolation(隔离级别),会有默认值,不同的值会走不同的方法。

这里就是不同的传播行为会创建不同的事务,对!事务就是在这里创建的!
默认是required,会创建事务。如果不使用事务们就会有一个空的事务。
-----------
接下来讲测试代码的下一行,会进入调用代码更改数量,此方法也是有事务的,此时会走下图这里的标红框处,因为事务已经存在。

先上图

这里就是事务的传递了,上面做了总结,
使用当前事务没啥说的,就是用当前的事务,不创建新的。
重点说下required_new 和 nested(嵌套事务)
nested的话,走判断,如果可以创建savePoint,那就走嵌套事务,如果不可以,那就走required_new
1 required_new,挂起当前事务,创建新的事务,
required_new事务里面,回滚就回滚出去了,而且抛出去的错(如果此事务被自己catch掉,并且不抛出,那就另说),会被外层的事务catch到,所以就都回滚了。

2 nested 嵌套事务
nested事务里面,回滚的话,会回滚到保存点savePoint,不影响外层事务。而外部事务如果出错,会影响到嵌套事务,事务会回滚到保存点。(required_new事务结束就是提交了,nested 事务提交后的保存点还是有效的,所以会回滚到保存点)
spring事务管理实现原理-源码-传播属性的更多相关文章
- spring事务管理器的源码和理解
原文出处: xieyu_zy 以前说了大多的原理,今天来说下spring的事务管理器的实现过程,顺带源码干货带上. 其实这个文章唯一的就是带着看看代码,但是前提你要懂得动态代理以及字节码增强方面的知识 ...
- 【面试】足够“忽悠”面试官的『Spring事务管理器』源码阅读梳理(建议珍藏)
PS:文章内容涉及源码,请耐心阅读. 理论实践,相辅相成 伟大领袖毛主席告诉我们实践出真知.这是无比正确的.但是也会很辛苦. 就像淘金一样,从大量沙子中淘出金子一定是一个无比艰辛的过程.但如果真能淘出 ...
- Spring IOC和Spring AOP的实现原理(源码主线流程)
写在前面 正本文参考了<spring技术内幕>和spring 4.0.5源码.本文只描述原理流程的主线部分,其他比如验证,缓存什么可以具体参考源码理解. Spring IOC 一.容器初始 ...
- 框架源码系列十一:事务管理(Spring事务管理的特点、事务概念学习、Spring事务使用学习、Spring事务管理API学习、Spring事务源码学习)
一.Spring事务管理的特点 Spring框架为事务管理提供一套统一的抽象,带来的好处有:1. 跨不同事务API的统一的编程模型,无论你使用的是jdbc.jta.jpa.hibernate.2. 支 ...
- Spring 事务管理原理探究
此处先粘贴出Spring事务需要的配置内容: 1.Spring事务管理器的配置文件: 2.一个普通的JPA框架(此处是mybatis)的配置文件: <bean id="sqlSessi ...
- Spring Boot 揭秘与实战 源码分析 - 工作原理剖析
文章目录 1. EnableAutoConfiguration 帮助我们做了什么 2. 配置参数类 – FreeMarkerProperties 3. 自动配置类 – FreeMarkerAutoCo ...
- Spring事务管理机制的实现原理-动态代理
之前在做项目中遇到spring无法进行事务代理问题,最后发现是因为没有写接口,原因当时明白了,看到这篇文章写的清楚些,转过来 我们先来分析一下Spring事务管理机制的实现原理.由于Spring内置A ...
- 阿里面试挂了,就因为面试官说我Spring 事务管理(器)不熟练?
前言 事务管理,一个被说烂的也被看烂的话题,还是八股文中的基础股之一.但除了八股文中需要熟读并背诵的那些个传播行为之外,背后的"为什么"和核心原理更为重要. 写这篇文章之前,我 ...
- spring事务管理器设计思想(2)
spring事务管理器设计思想(二) 上文见<spring事务管理器设计思想(一)> 对于第二个问题,涉及到事务的传播级别,定义如下: PROPAGATION_REQUIRED-- 如果当 ...
随机推荐
- MySQL状态变量详解
MySQL状态变量详解 mysql的状态变量(status variables)记录的mysql服务器的运行状态信息.查看语法如下: SHOW [GLOBAL | SESSION] STATUS; S ...
- MySQL测试报告
硬件配置: 3台服务器:192.168.23.168, 192.168.23.169, 192.168.23.170 硬盘:230G 内存:16G Linux内核:Linux geoserver. ...
- messageBox 的几种显示方式
1.最简单的,只显示提示信息 MessageBox.Show("Hello~~~~"); 2. 可以给消息框加上标题. MessageBox.Show("There ar ...
- JAVA常量与变量
顺着箭头的转换为自动转换逆这箭头的转换为强制转换. 常量 关键字FINAL 命名为大写 标识符 1要以字母数字下划线和¥组成 2首字母不能为数字 3不能是JAVA的关键字和 保留字 4数据类型分为基本 ...
- MFC系统自动生成的停靠窗格关掉后,如何重新显示?
就是这几个x,关闭之后,再也显示不出来了: 原来,系统会默认记忆上次的状态,可以用函数来清除这个设置: 在MainFrame那个类中,CreateDocablePane之前,调用EnableLoadD ...
- 黄聪:VS2017调试时提示“运行时无法计算表达式的值”
具体操作: 工具-选项-调试-常规,选中“使用托管兼容模式”,问题解决
- JAVA面向对象编程之购物车界面的设计与功能的实现
1.小组成员及分工 小组成员 负责工作 兰泽祥 负责总体界面.Git代码库 吴修恩 负责MVC模式.类名包名的规范化 2.Git 仓库地址 仓库地址:https://gitee.com/lanzexi ...
- 关于RabbitMQ分布式集群架构
RabbitMQ分布式集群架构和高可用性(HA) (一) 功能和原理 设计集群的目的 允许消费者和生产者在RabbitMQ节点崩溃的情况下继续运行 通过增加更多的节点来扩展消息通信的吞吐量 1 集群配 ...
- 【nosql】之ehcache.xml文件属性描述
<ehcache updateCheck="false" name="shiroCache"> <defaultCache <!--最大 ...
- 观察者模式之一:java实现观察者模式
<观察者模式之一:java实现观察者模式> <观察者模式之二:JDK自带的观察者模式> 1.初步认识 观察者模式的定义: 在对象之间定义了一对多的依赖,这样一来,当一个对象改变 ...