Spring提供的事务管理 Spring框架最核心功能之一就是事务管理,而且提供一致的事务管理抽象,这能帮助我们: 提供一致的编程式事务管理API,不管使用Spring JDBC框架还是集成第三方框架使用该 Spring支持声明式事务和编程式事务事务类型。 spring事务特性 spring所有的事务管理策略类都继承自org.springframework.transaction.PlatformTransactionManager接口 其中TransactionDefinition Spring不仅提供这些事务管理器,还提供对如JMS事务管理的管理器等,Spring提供一致的事务抽象如图9-1所示。 ? 图9-1 Spring事务管理器 接下来让我们学习一下如何在Spring配置文件中定义事务管理器: 一、声明对本地事务的支持: a)JDBC及iBATIS、MyBatis框架事务管理器 java代码:
用 Spring 的 @Transactional 注解控制事务有哪些不生效的场景? 不知道小伙伴们有没有这样的经历,在自己开心的编写业务代码时候,突然某一个方法里的事务好像失效了。 所以一度怀疑spring 的事务失效了。那么这篇文章就来总结一下,大家给大家造成 “spring事务失效”错觉的 几个常见场景,然后对症下药。 Let's GO!!! 以本人的经历中遇到的问题,大概分有以下几个场景: 数据库引擎是否支持事务(Mysql 的 MyIsam引擎不支持事务); 注解所在的类是否被加载为 Bean(是否被spring 管理); 注解所在的方法是否为 这个的解决方案之一就是在的类中注入自己,用注入的对象再调用另外一个方法,这个不太优雅,另外一个可行的方案可以参考《Spring 如何在一个事务中开启另一个事务?》这篇文章。 总结:本文总结了 8 种事务失效的场景,其实发生最多就是自身调用、异常被吃、异常抛出类型不对这 3 个了,像文章开头说的那样,本文不一定总结得全,只是总结常见的事务失效的场景 转自: https://blog.csdn.net
这两个例子中的事务都不会生效,因为它们发生了自身调用,就调用了该类自己的方法,而没有经过Spring的代理类,默认只有调用外部代理类的方法,事务才会生效,这也是老生常谈的问题了。 这个问题的解决方案之一就是在事务所在的类中注入自己,用往入的对象再调用另外一个方法,这个不太优雅,在Spring 中可以在当前线程中暴露并获取当前代理类,通过在启动类上添加以下注解来启用暴露代理类,如下面的示例所示 ) AopContext.currentProxy()).updateOrder();Spring 默认只有调用 Spring代理类的public 方法,事务才能生效。 Boot 中只要引入了 spring-boot-starter-data-jdbc 启动器依赖就会自动配置DataSourceTransactionManager数据源事务管理器,所以 Spring 8.
前言 前面已经讲述了Spring Aop的原理以及源码分析~ 若对Spring AOP还不是太了解的话,强烈建议出门左拐,先掌握AOP相关内容,因为Spring的事务管理就是基于Spring AOP 主要分为两大块: Spring对jdbc的支持 Spring对事务的支持 源码展示基于Spring版本号为:5.1.6.RELEASE 下同下同下同 源码展示基于Spring版本号为:5.1.6 SQLException { System.out.println(dataSource); // com.mysql.jdbc.jdbc2.optional.MysqlDataSource@650eab8 因此,不论底层事务策略如何变化,应用程序都无需任何改变 2、应用程序代码无需任何事务处理代码,可以更专注于业务逻辑的实现 3、Spring可对任何POJO的方法提供事务管理,而且Spring的声明式事务管理无需容器的支持 既然TransactionProxyFactoryBean产生的是事务代理Bean,可见Spring的声明式事务策略是基于Spring AOP的。
一、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,不超时
为什么要用事务 Redis的单个命令是原子性的(比如get set mget mset),如果涉及到多个命令的时候,需要把多个命令作为一个不可分割的处理序列,就需要用到事务。 Redis的事务涉及到四个命令: 命令 说明 multi 开启事务 exec 执行事务 discard 取消事务 watch 监视 事务用法 案例:张三(zhangsan)和李四(lisi)各有100 事务不能嵌套,多个multi命令效果一样。 通过exec的命令执行事务。如果没有执行exec,所有的命令都不会被执行。 如果中途不想执行事务了,怎么办? 可以调用discard可以清空事务队列,放弃执行。 这个显然不符合我们对原子性的定义,也就是我们没办法用Redis的这种事务机制来实现原子性,保证数据的一致。 为什么在一个事务中存在错误,Redis不回滚?
事务的回顾 在 MySQL 学习阶段,已经了解到了事务是一组操作的集合,也就是把所有的操作作为一个整体,一起向数据库提交或者撤销操作,要么同时成功,要么同时失败 一个事务的操作流程包括了,开启事务,执行事务操作 ,提交事务或回滚事务,对于回滚事务来说,如果程序在执行过程中出现了错误,那么此时就需要执行回滚事务 2. 编程式事务 Spring 手动操作事务和 MySQL 操作事务类似,也是分为开启事务,提交事务,回滚事务等三个操作,需要用到 DataSourceTransactionManager (事务管理器)来进行上述事务的操作 > <artifactId>spring-tx</artifactId> </dependency> 只需在要执行的方法上添加@Transactional注解,添加之后,如果没有发生异常就正常执行, 事务传播机制 事务传播机制是指在多个事务方法相互调用时,定义事务如何在这些方法之间传播的规则,也就是延用调用方法的事务还是再重新开启一个新事务 Spring 事务的传播机制有以下七种 事务传播机制 描述
,回滚事务) -- 开启事务 start transaction; -- 提交事务 commit; -- 回滚事务 rollback; 2.Spring中事务的实现 Spring中的事务操作分为两类 : -- 创建数据库 DROP DATABASE IF EXISTS trans_test; CREATE DATABASE trans_test DEFAULT CHARACTER SET utf8mb4 ) ON UPDATE now(), PRIMARY KEY (`id`) ) ENGINE = INNODB DEFAULT CHARACTER SET = utf8mb4 编程式事务 Spring手动操作事务和上面MySQL操作事务类似,有3个重要操作步骤: 开启事务(获取事务) 提交事务 回滚事务 SpringBoot内置了两个对象: DataSourceTransactionManager Spring事务传播机制有以下7种: Propagation.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事务分类 编程式事务 编程式事务管理使用 TransactionTemplate,需要显式执行事务。 Spring 事务的传播机制说的是,当多个事务同时存在的时候——一般指的是多个事务方法相互调用时,Spring 如何处理这些事务的行为。
前言 这篇其实也要归纳到《常识》系列中,但这重点又是spring的介绍,故归档在spring系列中。 工作很多年,除了学生时代学过,事务还真没有用过。 在T1时刻开启了事务1,T2时刻开启了事务2, 在T3时刻事务1从数据库中取出了id="402881e535194b8f0135194b91310001"的数据, T4时刻事务2取出了同一条数据, T5 在T1时刻开启了事务1,T2时刻开启了事务2, 在T3时刻事务1从数据库中取出了id="402881e535194b8f0135194b91310001"的数据, 在T5时刻事务1将age的值更新为30 在T1时刻开启了事务1,T2时刻开启了事务2, 在T3时刻事务1从数据库中取出了id="402881e535194b8f0135194b91310001"的数据,此时age=20, T4时刻事务2查询同一条数据 Spring事务管理器 Spring事务管理涉及的接口的联系如下: ?
Spring事务 事务管理是应用系统开发中必不可少的一部分。Spring 为事务管理提供了丰富的功能支持。Spring 事务管理分为编码式和声明式的两种方式。 注释配置是目前流行的使用方式,因此本文将着重介绍基于@Transactional 注解的事务管理。 Spring事务隔离级别 其实就是事务的隔离级别 DEFAULT 使用数据库默认的事务隔离级别. 串行化的 (serializable) 所有事务请求串行执行 实现原理 利用Spring Aop实现的。 方法执行成功,则提交事务。如果执行方法中出现异常,则回滚事务。 Spring事务传播 事务传播行为指当一个事务方法被另一个事务方法调用时,这个事务方法应该如何进行。 Spring定义了七种传播行为: PROPAGATION_REQUIRED 如果上下文中存在一个事务,则加入到当前事务。如果没有事务则开启一个新的事务。
如果对Spring事务的@Transactional理解有限的话,确实很容易在开发中忽视一些细节问题,导致业务不可用的Bug。 3、@Transactional 应用在非 public 修饰的方法上 以下来自 Spring 官方文档: When using proxies, you should apply the @Transactional 之所以会失效是因为在Spring AOP 代理时,如上图所示 TransactionInterceptor (事务拦截器)在目标方法执行前后进行拦截,DynamicAdvisedInterceptor( Spring默认抛出了未检查unchecked异常(继承自 RuntimeException 的异常)或者 Error才回滚事务;其他异常不会触发回滚事务。 如果在事务中抛出其他类型的异常,但却期望 Spring 能够回滚事务,就需要指定 rollbackFor属性。 ?
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事务管理的文章,感觉都没有讲全,这里就将书上的和网上关于事务的知识简要总结梳理一下 Spring声明式事务让我们从复杂的事务处理中得到解脱。 声明事务 1、配置方式-注解元数据驱动的声明式事务(@Transactional)、也可以采用XML元数据驱动的声明式事务 2、实现原理-Spring事务采用AOP的方式实现、PlatformTransactionManager 4、Spring事务保存点savepoint,创建基于SavePoint的嵌套事务来实现编程式事务管理。 ; 4、如果使用了SpringMVC,SpringMVC容器有没有重复扫描; 业务代码是否吞掉异常; 5、Spring的事务管理默认只对出现运行期异常(java.lang.RuntimeException