太原企业网站制作,开一个网站需要多少钱,站长工具如何使用,云南楚雄旅游必去的景点#x1f4eb;作者简介#xff1a;小明java问道之路#xff0c;2022年度博客之星全国TOP3#xff0c;专注于后端、中间件、计算机底层、架构设计演进与稳定性建设优化#xff0c;文章内容兼具广度、深度、大厂技术方案#xff0c;对待技术喜欢推理加验证#xff0c;就职于… 作者简介小明java问道之路2022年度博客之星全国TOP3专注于后端、中间件、计算机底层、架构设计演进与稳定性建设优化文章内容兼具广度、深度、大厂技术方案对待技术喜欢推理加验证就职于知名金融公司后端高级工程师。 热衷分享喜欢原创~ 关注我会给你带来一些不一样的认知和成长。 2022博客之星TOP3 | CSDN博客专家 | 后端领域优质创作者 | CSDN内容合伙人 InfoQ(极客邦)签约作者、阿里云专家 | 签约博主、51CTO专家 | TOP红人、华为云享专家 如果此文还不错的话还请关注、点赞、收藏三连支持一下博主~ 文末获取联系 精彩专栏推荐订阅收藏 专栏系列点击解锁 学习路线点击解锁 知识定位 Redis从入门到精通与实战 Redis从入门到精通与实战 围绕原理源码讲解Redis面试知识点与实战 MySQL从入门到精通 MySQL从入门到精通 全面讲解MySQL知识与企业级MySQL实战 计算机底层原理 深入理解计算机系统CSAPP 以深入理解计算机系统为基石构件计算机体系和计算机思维 Linux内核源码解析 围绕Linux内核讲解计算机底层原理与并发 数据结构与企业题库精讲 数据结构与企业题库精讲 结合工作经验深入浅出适合各层次笔试面试算法题精讲 互联网架构分析与实战 企业系统架构分析实践与落地 行业最前沿视角专注于技术架构升级路线、架构实践 互联网企业防资损实践 互联网金融公司的防资损方法论、代码与实践 Java全栈白宝书 精通Java8与函数式编程 本专栏以实战为基础逐步深入Java8以及未来的编程模式 深入理解JVM 详细介绍内存区域、字节码、方法底层类加载和GC等知识 深入理解高并发编程 深入Liunx内核、汇编、C全方位理解并发编程 Spring源码分析 Spring核心七IOC/AOP等源码分析 MyBatis源码分析 MyBatis核心源码分析 Java核心技术 只讲Java核心技术 本文目录
本文导读
一、什么是Spring 事务
二、Spring 的事务隔离级别
三、Spring事务分类
四、Spring 事务原理
1、Transactional 工作机制
2、Spring 事务原理详解
五、Spring 的事务传播机制
总结 本文导读
本文主要解读什么是Spring事务Spring事务隔离级别Spring编程式事务TransactionTemplate以及Transactional原理最后讲解Spring常考题事务传播机制。
一、什么是Spring 事务
Spring 事务的本质其实就是数据库对事务的支持没有数据库的事务支持Spring 是无法提供事务功能的。
Spring 只提供统一事务管理接口具体实现都是由各数据库自己实现数据库事务的提交和回滚是通过数据库自己的事务机制实现。
二、Spring 的事务隔离级别
Spring的接口TransactionDefinition中定义了表示隔离级别的常量当然其实主要还是对应数据库的事务隔离级别
isolation_default使用后端数据库默认的隔离界别mysql 默认可重复读
isolation_read_uncommitted读未提交
isolation_read_committed读已提交
isolation_repeatable_read可重复读
isolation_serializable串行化
三、Spring事务分类
编程式事务编程式事务管理使用 TransactionTemplate需要显式执行事务。
声明式事务声明式事务管理建立在 AOP 之上的。其本质是通过 AOP 功能对方法前后进行拦截将事务处理的功能编织到拦截的方法中也就是在目标方法开始之前启动一个事务在执行完目标方法之后根据执行情况提交或者回滚事务。优点是不需要在业务逻辑代码中掺杂事务管理的代码只需在配置文件中做相关的事务规则声明或通过 Transactional 注解的方式便可以将事务规则应用到业务逻辑中减少业务代码的污染。唯一不足地方是最细粒度只能作用到方法级别无法做到像编程式事务那样可以作用到代码块级别。
四、Spring 事务原理
1、Transactional 工作机制
Transactional 的工作机制是基于 AOP 实现的。如果一个类或者一个类中的 public 方法上被标注Transactional 注解的话Spring 容器就会在启动的时候为其创建一个代理类。
在调用被Transactional 注解的 public 方法的时候实际调用的是TransactionInterceptor 类中的 invoke()方法。这个方法的作用就是在目标方法之前开启事务方法执行过程中如果遇到异常的时候回滚事务方法调用完成之后提交事务。
2、Spring 事务原理详解
在Bean初始化阶段创建代理对象Spring容器在初始化每个单例bean的时候会遍历容器中的所有BeanPostProcessor实现类并执行其postProcessAfterInitialization方法在执行AbstractAutoProxyCreator类的postProcessAfterInitialization方法时会遍历容器中所有的切面查找与当前实例化bean匹配的切面这里会获取事务属性切面查找Transactional注解及其属性值然后根据得到的切面创建一个代理对象默认是使用JDK动态代理创建代理如果目标类是接口则使用JDK动态代理否则使用Cglib。
在执行目标方法时进行事务增强操作当通过代理对象调用Bean方法的时候会触发对应的AOP增强拦截器声明式事务是一种环绕增强对应接口为MethodInterceptor事务增强对该接口的实现为TransactionInterceptor。
事务拦截器TransactionInterceptor在invoke方法中通过调用父类 TransactionAspectSupport 的invokeWithinTransaction方法进行事务处理包括开启事务、事务提交、异常回滚。 五、Spring 的事务传播机制 public enum Propagation { REQUIRED //required需要事务如果事务不存在则创建一个新事务 REQUIRES_NEW //required_new需要创建一个新事务如果已存在事务则把当前事务挂起 NESTED //nested嵌套事务SUPPORTS //supports支持事务如果没有事务则以非事务的方式运行 NOT_SUPPORTED //not_supported不支持事务以非事务的方式运行如果存在事务则挂起 NEVER //never不支持事务如果存在事务则抛出异常 MANDATORY //mandatory支持事务如果没有事务则抛出异常
}requiredTransactional注解默认使用就是这个事务传播行为。如果外部方法没有开启事务的话Propagation.required修饰的内部方法会新开启自己的事务且开启的事务相互独立互不干扰。如果外部方法开启事务并且被Propagation.required的话所有Propagation.REQUIRED修饰的内部方法和外部方法均属于同一事务 只要一个方法回滚整个事务均回滚。
requires_new创建一个新的事务不管外部方法是否开启事务Propagation.requires_new修饰的内部方法会新开启自己的事务且开启的事务相互独立互不干扰。
nested嵌套事务子事务执行完不会立即提交而是等待外层事务完成后一起提交。
supports如果当前存在事务则加入该事务如果当前没有事务则以非事务的方式继续运行。
not_supported以非事务方式运行如果当前存在事务则把当前事务挂起。
never以非事务方式运行如果当前存在事务则抛出异常。
mandatory如果当前存在事务则加入该事务如果当前没有事务则抛出异常。mandatory强制性
总结
本文主要解读什么是Spring事务Spring事务隔离级别Spring编程式事务TransactionTemplate以及Transactional原理最后讲解Spring常考题事务传播机制。