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-- 如果当 ...
随机推荐
- golang channel几点总结
golang提倡使用通讯来共享数据,而不是通过共享数据来通讯.channel就是golang这种方式的体现. Channel 在golang中有两种channel:带缓存的和不带缓存. 带缓存的cha ...
- Feign 使用入门
Feign 的目的是简化 Web Service 客户端的开发,在使用 Feign 时,使用注解来修饰接口,被注解修饰的接口具有访问 Web Service 的能力,包括 Feign 自带的注解,也支 ...
- Elasticsearch的脚本化数据导入导出
我用的ES的版本是2.4.1,由于没有相应的命令实现数据的导入和导出,就是像mysql的那种mysqldump类似的指令. 更苦逼的是,我们的生产和测试环境,还不能联网,连ES的第三方的插件都没有办法 ...
- 信号滤波模块verilog代码---UNLOCK,LOCK状态机方式
信号滤波模块verilog代码 `timescale 1ns / 1ps /////////////////////////////////////////////////////////////// ...
- java集合之List源码解析
List是java重要的数据结构之一,我们经常接触到的有ArrayList.Vector和LinkedList三种,他们都继承来自java.util.Collection接口,类图如下 接下来,我们对 ...
- 《JavaScript设计模式与开发》笔记 2.this指针
1.作为对象方法调用 2.作为普通函数调用 1.作为普通函数进行调用 2.将函数赋值给一个对象 3.callback内部的this指向了window 4.解决callback内部的this问题 3.构 ...
- system.Data.Entity.Infrastructure.DbUpdateConcurrencyException: Store update, insert, or delete statement affected an unexpected number of rows (0) 问题
页面控件没有做限制.提交后还可以继续点击,造成了在短时间内的多次请求.查看日志两次错误在200ms之内. 错误信息 system.Data.Entity.Infrastructure.DbUpdate ...
- 如何在Java中获取键盘输入值
程序开发过程中,需要从键盘获取输入值是常有的事,但Java它偏偏就没有像c语言给我们提供的scanf(),C++给我们提供的cin()获取键盘输入值的现成函数!Java没有提供这样的函数也不代表遇到这 ...
- ALGO-140_蓝桥杯_算法训练_P1101
有一份提货单,其数据项目有:商品名(MC).单价(DJ).数量(SL).定义一个结构体prut,其成员是上面的三项数据.在主函数中定义一个prut类型的结构体数组,输入每个元素的值,计算并输出提货单的 ...
- 蓝桥杯-四阶幻方(DFS)
标题:四阶幻方 把1~16的数字填入4x4的方格中,使得行.列以及两个对角线的和都相等,满足这样的特征时称为:四阶幻方. 四阶幻方可能有很多方案.如果固定左上角为1,请计算一共有多少种方案. 比如: ...