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-- 如果当 ...
随机推荐
- Spark官网资料学习网址
百度搜索Spark: 这一个是Spark的官网网址,你可以在上面下载相关的安装包等等. 这一个是最新的Spark的文档说明,你可以查看如何安装,如何编程,以及含有对应的学习资料.
- Go 缓冲信道和非缓冲信道
非缓冲信道是一个进一个出,再一个进再一个出,信道内是不保存数据的 缓冲信道是可以很多个依次进去,存储在信道里,然后一个一个的按次序取出来. 不过缓冲信道如果超过了预期的存入个数,会发生信道阻塞,只有把 ...
- centos下redis的导出和导入(限set命令)
#!/bin/bash REDIS_HOST=127.0.0.1 REDIS_PORT=6379 REDIS_DB=10 KEYNAME="*" KEYFILE=redis_key ...
- php函数总结2
1.匿名参数 func_get_args //获取参数列表的数组 func_get_arg(num) //数组索引 func_num_args() //获取匿名函数的个数 <?php funct ...
- Windows Server 2016 禁止自动更新后重启
管理员运行cmd 输入Sconfig, 选择5,选择m
- HTTP协议之chunk介绍
http chunked 当客户端向服务器请求一个静态页面或者一张图片时,服务器可以很清楚的知道内容大小,然后通过Content-Length消息首部字段告诉客户端需要接收多少数据.但是如果是动态页面 ...
- VirtualBox中挂载物理磁盘
注1. 详细内容请参考VirtualBox帮助文件. 注2. 需对dos命令有一定了解. 注3. 以下命令均需以管理员身份执行,VirtualBox也需以管理员身份运行. 主要应用host上的vbox ...
- spring 基本配置学习
1.bean的方式说明 作用: 用于配置对象让spring来创建的. 默认情况下它调用的是类中的无参构造函数.如果没有无参构造函数则不能创建成功. 属性: id:给对象在容器中提供一个唯一标识. ...
- bzoj5011: [Jx2017]颜色
Description 可怜有一个长度为n的正整数序列Ai,其中相同的正整数代表着相同的颜色. 现在可怜觉得这个序列太长了,于是她决定选择一些颜色把这些颜色的所有位置都删去. 删除颜色i可以定义为把所 ...
- P1164小A点菜
传送 这是一个典型的背包方案问题,设f[j]为当前价值为j的方案数,则f[j]=f[j]+f[j-a[i]],即当前方案数为选这个的方案数和不选这个东西的方案数,代码如下 #include<io ...