今天有时间, 重新回顾了一下Spring的7大传播特性, 并且我画了图,便于李姐, 自我感觉还不错, 底部还有对领导的吐槽, 下次面试问我对加班的看法, 可以回复 mandatory, NEVER 哈哈哈 required 默认的 使用当前的事务, 如果当前没有事务,则自己新建一个事务,子方法是必须运行在一个事务中的, 如果当前存在事务,则加入当前事务, 成为一个整体 样例: supports 如果当前有事务 , 则使用事务, 如果当前没有事务, 则不使用事务 mandatory 外部必须存在事务, 不存在就抛异常 required_new 如果当前有事务, 则挂起当前事务, 并创建一个自己新的事务, 如果当前没有事务 , 则同 required not_supported 如果当前有事务, 则把当前事务挂起, 自己不使用事务执行, never 如果当前有事务, 直接抛出异常 nested 如果当期有事务, 则开启一个子事务 (嵌套事务), 嵌套事务是独立提交或者独立回滚的, 如果当前没有事务, 则同Required 汇总 传播特性 通俗易懂 required 领导没钱, 我有钱, 我自己吃饭, 领导有钱, 领导给我买饭
本文详解Spring事务中的7种传播行为,还是比较重要的。 环境 jdk1.8 Spring 5.2.3.RELEASE mysql5.7 什么是事务传播行为? Propagation是个枚举,有7种值,如下: 事务传播行为类型 说明 REQUIRED 如果当前事务管理器中没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。 注意:这7种传播行为有个前提,他们的事务管理器是同一个的时候,才会有上面描述中的表现行为。 下面通过案例对7中表现行为来做说明,在看案例之前,先来回顾几个知识点 1、Spring声明式事务处理事务的过程 spring声明式事务是通过事务拦截器TransactionInterceptor拦截目标方法 所以spring中可以确保事务管理器中的Connection和JdbcTemplate中操作db的Connection是同一个,这样才能确保spring可以控制事务。
一、Spring事务简介 事务作用:在数据层保障一系列的数据库操作同成功同失败 Spring事务作用:在数据层或业务层保障一系列的数据库操作同成功同失败 实现: 通过PlatformTransactionManager : Spring配置类中使用@EnableTransactionManagement注解开启事务管理 在JdbcConfig中设置事务管理器: @Bean public PlatformTransactionManager @Transactional注解开启事务 Spring注解式事务通常添加在业务层接口中而不会添加到业务层实现类中,降低耦合 注解式事务可以添加到业务方法上表示当前方法开启事务,也可以添加到接口上表示当前接口所有方法开启事务 三、Spring事务角色 事务管理员:发起事务方,在Spring中通常指代业务层开启事务的方法 事务协调员:加入事务方,在Spring中通常指代数据层方法,也可以是业务层方法 四、事务相关配置 属性 在业务层接口上添加Spring事务,设置事务传播行为REQUIRES_NEW(需要新事务): public interface LogService { @Transactional(propagation
1、什么是事务? 事务是指逻辑上的一组操作,这组操作要么全部成功,要么全部失败。 2、事务的特性 ①原子性:指事务的操作要么全部都发生,要么都不发生。 ③隔离性:指多个事务并发访问数据库时,一个用户的事务不能被其他用户的事务所干扰,多个并发事务之间数据要相互隔离(可以通过设置事务的隔离级别解决,后续会讲到)。 3、Spring事务管理器 Spring事务管理器高层抽象接口主要有3个接口 ①PlatformTransactionManager(平台事务管理器):主要是进行事务的提交回滚等功能。 ③TransactionStatus(事务具体运行状态):包括事务是否已提交、是否是新创建的事务、是否有保存点等。 4、PlatformTransactionManager接口 根据不同的持久化框架提供了不同的PlatformTransactionManager接口实现: ①使用Spring JDBC或iBatis
Spring 事务 关于理论性的内容,我在之前的一篇文章中介绍过,这里不再过多阐述,这里给出之前文章的链接:Spring 事务管理 什么是事务 是一组逻辑操作,要么执行,要么不执行。 -- 数据源 --> <property name="dataSource" ref="dataSource" /> </bean> Spring 事务接口 PlatformTransactionManager (2)事务传播行为(为了解决业务层方法之间互相调用的事务问题): 当事务方法被另一个事务方法调用时,必须指定事务应该如何传播。 例如:方法可能继续在现有事务中运行,也可能开启一个新事务,并在自己的事务中运行。 ,则加入该事务;如果当前没有事务,则创建一个新的事务。
一、什么是事务 逻辑上的一组操作,组成这组操作的各个逻辑单元,要么一起成功,要么一起失败。 二、事务的特性(ACID) 原子性:确保动作要么全部完成,要么完全不起作用 一致性:一旦所有事务动作完成,事务就要被提交。 数据保持一致性 隔离性:多个事务会同时处理相同的数据,每个事务都应该隔离开,防止数据损坏 持久性:事务一旦完成,无论系统如何,结果不受影响,事务结果持久化到硬盘中 三、基于xml配置文件方式 < -- 2.配置事务的增强,指定对哪个事务管理器进行增强 --> <tx:advice id="txAdvice" transaction-manager="transactionManager" 事务方法(增删改)之间互相调用,事务的管理方式 isolation:事务传播行为 timeout:超时时间 ⑴ 事务需要在一定时间内进行提交,如果不提交进行回滚 ⑵ 默认值为-1,不超时
事务的回顾 在 MySQL 学习阶段,已经了解到了事务是一组操作的集合,也就是把所有的操作作为一个整体,一起向数据库提交或者撤销操作,要么同时成功,要么同时失败 一个事务的操作流程包括了,开启事务,执行事务操作 ,提交事务或回滚事务,对于回滚事务来说,如果程序在执行过程中出现了错误,那么此时就需要执行回滚事务 2. 编程式事务 Spring 手动操作事务和 MySQL 操作事务类似,也是分为开启事务,提交事务,回滚事务等三个操作,需要用到 DataSourceTransactionManager (事务管理器)来进行上述事务的操作 > <artifactId>spring-tx</artifactId> </dependency> 只需在要执行的方法上添加@Transactional注解,添加之后,如果没有发生异常就正常执行, 事务传播机制 事务传播机制是指在多个事务方法相互调用时,定义事务如何在这些方法之间传播的规则,也就是延用调用方法的事务还是再重新开启一个新事务 Spring 事务的传播机制有以下七种 事务传播机制 描述
,回滚事务) -- 开启事务 start transaction; -- 提交事务 commit; -- 回滚事务 rollback; 2.Spring中事务的实现 Spring中的事务操作分为两类 编程式事务 Spring手动操作事务和上面MySQL操作事务类似,有3个重要操作步骤: 开启事务(获取事务) 提交事务 回滚事务 SpringBoot内置了两个对象: DataSourceTransactionManager 串行化(SERIALIZABLE):序列化,事务最高隔离级别.它会强制事务排序,使之不会发生冲突,从而解决了脏读,不可重复读和幻读问题,但因为执行效率低,所以真正使用的场景并不多 3.2.2 Spring Spring事务传播机制有以下7种: Propagation.REQUIRED:默认的事务传播级别.如果当前存在事务,则加入该事务.如果当前没有事务,则创建一个新的事务。 3.3.3 Spring事务传播机制使用和各种场景演示 重点学习: REQUIRED(默认值) REQUIRES_NEW 3.3.3.1 REQUIRED(加入事务) 代码实现: 用户注册
2、Spring事务基本概念 2.1、基础配置 我们先来回顾一下Spring事务的基础配置信息,以下由ChatGPT给我们提供的相关资料: 2.1.1、Spring事务的基础配置 1、问:Spring事务的基础配置 配置事务管理器:事务管理器是 Spring 中用来管理事务的核心组件。 2.1.2、Spring事务的传播特性 问:Spring事务的传播特性 ChatGPT答:在 Spring 中,事务的传播特性(Propagation)用于控制在嵌套事务中,事务的行为如何传播到嵌套的方法调用中 Spring事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,Spring也无法提供事务功能。 而是交由Spring自己完成。那么Spring使用事务的方式有哪些呢?在 Spring 中,我们可以通过声明式事务管理和编程式事务管理两种方式来管理事务。
23.Spring 事务的种类?24.Spring 的事务隔离级别?25.Spring 的事务传播机制?26.声明式事务实现原理了解吗?27.声明式事务在哪些情况下会失效?----什么是事务? Spring 事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,Spring 是无法提供事务功能的。 接下来由叶秋学长带领你们学习Spring事务~23.Spring 事务的种类? Spring 事务的传播机制说的是,当多个事务同时存在的时候——一般指的是多个事务方法相互调用时,Spring 如何处理这些事务的行为。 编辑7种事务传播机制Spring默认的事务传播行为是PROPAFATION_REQUIRED,它适合绝大多数情况,如果多个ServiceX#methodX()都工作在事务环境下(均被Spring事务增强
,但是事务还未提交, T6时刻事务2读取同一条记录,获得age的值为30,但是事务1还未提交, 若在T7时刻事务1回滚了事务2的数据就是错误的数据(脏数据), 这种情况叫做" 脏读(dirty read T7事务1再次查询数据数据时,记录变成两条了。 这种情况是"虚读(phantom read)"。 , T5事务2更新数据age=30,T6时刻事务2提交事务, T7事务1查询同一条数据,发现数据与第一次不一致。 在T1时刻开启了事务1,T2时刻开启了事务2, T3时刻事务1更新数据age=25, T5时刻事务2更新数据age=30, T6时刻提交事务, T7时刻事务2提交事务,把事务1的更新覆盖了。 Spring事务管理器 Spring事务管理涉及的接口的联系如下: ?
Spring事务 事务管理是应用系统开发中必不可少的一部分。Spring 为事务管理提供了丰富的功能支持。Spring 事务管理分为编码式和声明式的两种方式。 注释配置是目前流行的使用方式,因此本文将着重介绍基于@Transactional 注解的事务管理。 Spring事务隔离级别 其实就是事务的隔离级别 DEFAULT 使用数据库默认的事务隔离级别. 串行化的 (serializable) 所有事务请求串行执行 实现原理 利用Spring Aop实现的。 方法执行成功,则提交事务。如果执行方法中出现异常,则回滚事务。 Spring事务传播 事务传播行为指当一个事务方法被另一个事务方法调用时,这个事务方法应该如何进行。 Spring定义了七种传播行为: PROPAGATION_REQUIRED 如果上下文中存在一个事务,则加入到当前事务。如果没有事务则开启一个新的事务。
如果对Spring事务的@Transactional理解有限的话,确实很容易在开发中忽视一些细节问题,导致业务不可用的Bug。 之所以会失效是因为在Spring AOP 代理时,如上图所示 TransactionInterceptor (事务拦截器)在目标方法执行前后进行拦截,DynamicAdvisedInterceptor( Spring默认抛出了未检查unchecked异常(继承自 RuntimeException 的异常)或者 Error才回滚事务;其他异常不会触发回滚事务。 如果在事务中抛出其他类型的异常,但却期望 Spring 能够回滚事务,就需要指定 rollbackFor属性。 ? i = 1/0; }catch (Exception e){ throw new Exception("发生异常"); } } } 7、
2 Spring事务管理
PlatformTransactionManager事务管理器
TransactionDefinition事务定义信息
TransactionStatus事务具体运行状态
2.1 以下为几个常见的PlatformTransactionManager实现:
事务 说明
DataSourceTransactionManager 使用Spring JDBC或MyBatis进行持久化时使用 新建事务,如果有事务,则挂起当前事务
PROPAGATION_NOT_SUPPORTED 非事务方式运行,如果有事务,则挂起当前事务
PROPAGATION_NEVER 非事务方式运行,如果有事务,则抛出异常 PROPAGATION_NESTED 如果有事务,则以嵌套方式运行
没有则与PROPAGATION_REQUIRED类似
2.2.2 事务隔离级别
Spring事务隔离级别
隔离级别 解释 3 事务管理的方式
Spring提供了两种事务管理方式:编程式事务管理,声明式事务管理。
编程式事务管理:使用TransactionTemplate来简化编程式事务和异常处理。
在使用Spring管理事务时会遇到一些情况使事务失效,下面列举一些常见的情况: 1. 可能有一些特殊情况导致使用MySQL 5.5.5之后版本的默认的存储引擎也为MyISAM,如果是这样,那么Spring事务便不会生效。 @Transactional注解所在的类不是 Spring 容器的 bean @Service public class LogServiceImpl implements LogService { String in, Double money) { ... }; }; 此时,如果把 @Service 注解删除,那么这个类就不会被加载成一个 bean,那么这个类不会被 Spring DataSource必须和MyBatis中的DataSource一致,并且事务管理器要被Spring管理。
Spring 事务不生效的原因 同一个类中无事务方法调用一个有事务方法事务不生效 public void testTransactionWork() { insertTransaction(); Spring 事务的传播级别 Spring 事务传播级别与数据库事务隔离级别不同,传播分为 7 种级别: PROPAGATION_REQUIRED:Spring的默认传播级别,如果上下文中存在事务则加入当前事务 如果外层有事务并抛出异常,被嵌套的内层事务会回滚,反之如果内层事务抛出异常,外层事务不受影响。 这里的原因是,当事务发生异常会设置一个状态 Rollback, 如果外围事务读到了这个异常的状态,提交的时候就会抛出上述的异常(详细代码可以看参考资料中 Spring 事务源码分析) PROPAGATION_REQUIRES_NEW ,内部事务为外围事务的子事务,插入“张三”内部方法抛出异常,可以单独对子事务回滚 参考资料 Spring 事务源码剖析 一口气说出6中@Transactional失效的场景
疫情期间在家重新读了《Spring in Action》,每次翻阅总有一些收获,之后在网上看了一些关于Spring事务管理的文章,感觉都没有讲全,这里就将书上的和网上关于事务的知识简要总结梳理一下 1、基本概念 |-/ 事务的目的 |-/ 事务特性(ACID) |-/ 事务的7种传播行为 2、声明式事务 |-/ 配置方式 |-/ 实现原理 3、编程式事务 4、常见问题 Spring声明式事务让我们从复杂的事务处理中得到解脱。 4、Spring事务保存点savepoint,创建基于SavePoint的嵌套事务来实现编程式事务管理。 及其子类)进行回滚; 6、业务和事务入口是否在同一个线程里; 7、service方法中是否直接调用本类中的另一个方法
--spring tx Spring 事务管理jar包--> <dependency> <groupId>org.springframework</groupId 2.3 声明式事务 Spring框架提供了声明式事务管理的功能,允许开发者通过配置来定义事务规则,而无需编写大量的事务管理代码。 声明式事务是通过Spring的AOP(面向切面编程)来实现的,通常使用注解或XML配置来定义事务。 因为没有添加事务,图书的库存更新了,但是用户的余额没有更新 显然这样的结果是错误的,购买图书是一个完整的功能,更新库存和更新余额要么都成功要么都失败 3.3、加入事务 ①添加事务配置 在spring配置文件中引入 以下是Spring基于XML的声明式事务是如何实现的简要步骤: 4.1、准备工作 可以直接把基于注解的声明式事务的工程直接拷贝一份,改个名字即可 4.2、修改Spring配置文件 将Spring配置文件中去掉
一、事务基本概念 什么是事务 数据库事务( transaction)是访问并可能操作各种数据项的一个数据库操作序列 这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位 事务的特性 A:原子性 由并发事务所做的修改必须与任何其他并发事务所做的修改隔离 事务查看数据更新时,数据所处的状态要么是另一事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看到中间状态的数据 D:持久性(Durability (requires_new):开启一个新的事务,如果一个事务已经存在,则将这个存在的事务挂起【不管有没有,直接开启一个新事务,开启的新事务和之前的事务不存在嵌套关系,之前事务被挂起】适用内部事务和外部事务不存在业务关联情况 ,如日志 NOT_SUPPORTED(not_supported):以非事务方式运行,如果有事务存在,挂起当前事务【不支持事务,存在就挂起】 NEVER(never):以非事务方式运行,如果有事务存在, 被嵌套的事务可以独立于外层事务进行提交或回滚。如果外层事务不存在,行为就像REQUIRED一样【有事务的话,就在这个事务里再嵌套一个完全独立的事务,嵌套的事务可以独立的提交和回滚。
一、简介 接着上篇 数据库事务简介,来聊聊 Spring 事务。 Spring 本身并不实现事务,Spring 事务的本质还是底层数据库对事务的支持,没有数据库事务的支持,Spring 事务就不会生效。 Spring 事务提供了一套抽象的事务管理,并且结合 Spring IOC 和 Spring AOP,简化了应用程序使用数据库事务,并且通过声明式事务,可以做到应用程序无侵入的事务功能。 Spring 事务的本质其实就是 AOP 和 数据库事务,Spring 将数据库的事务操作提取为切面,通过 AOP 的方式增强事务方法。 PlatformTransactionManager PlatformTransactionManager 是 Spring 事务结构中的核心接口,Spring 并不直接管理事务,而是提供了多种事务管理器