Spring事务传播属性和隔离级别

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
云数据库 RDS PostgreSQL,高可用系列 2核4GB
简介: Spring事务传播属性和隔离级别一、Spring事务传播属性(Propagation):0) 事务的四个关键属性(ACID)1) REQUIRED(默认属性)需要事务2) MANDATORY 支持事务3) NEVER 不能有事务4) NOT_SUPPORTED 不支持事务5) REQUIRES_NEW 每次开启新的事务6) SUPPORTS 支持事务7) NESTED 嵌套事务二、Spring事务隔离级别(Isolation Level):1.首先说明一下事务并发引起的三种情况:1) Dirty Reads 脏读2) Non-Repeatable Reads 不可重

Spring事务传播属性和隔离级别

一、Spring事务传播属性(Propagation):

0) 事务的四个关键属性(ACID)

1) REQUIRED(默认属性)需要事务

2) MANDATORY 支持事务

3) NEVER 不能有事务

4) NOT_SUPPORTED 不支持事务

5) REQUIRES_NEW 每次开启新的事务

6) SUPPORTS 支持事务

7) NESTED 嵌套事务

二、Spring事务隔离级别(Isolation Level):

1.首先说明一下事务并发引起的三种情况:

1) Dirty Reads 脏读

2) Non-Repeatable Reads 不可重复读

3) Phantom Reads 幻像读

2.隔离级别:

1) DEFAULT (默认)

2) READ_UNCOMMITTED (读未提交)

3) READ_COMMITTED (读已提交)

4) REPEATABLE_READ (可重复读)

5) SERIALIZABLE(串行化)

三、 读写和异常性

1) timeout 超时性



 <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
    <!--创建数据源-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/2021?characterEncoding=UTF-8"/>
        <property name="username" value="root"/>
        <property name="password" value="root"/>
    </bean>
    <!--创建sqlSessionFactory-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!--注入datasource mapperlocations typeAaialsPackage-->
        <property name="dataSource" ref="dataSource"/>
        <property name="mapperLocations" value="classpath:com/mapper/*.xml"/>
        <property name="typeAliasesPackage" value="com.entity"/>
    </bean>
    <!--创建DAO-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!--注入sqlSessionFactory dao接口所在包-->
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
        <property name="basePackage" value="com.dao"/>
    </bean>
    <!--创建事务管理器-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>
    <!--创建事务环绕通知并进行事务细粒度控制-->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <!--对方法进行细粒度事务控制-->
        <tx:attributes>
            <!--
 propagation: 事务传播属性
 REQUIRED: 需要事务           如果外层没有事务 则开启新的事务   如果外层存在事务,则融入当前事务
SUPPORTS: 支持事务           如果外层没有事务 不会开启新的事务 如果外层存在事务,则融入当前事务
 REQUIRES_NEW: 每次开启新的事务     如果外层存在事务,外层事务挂起,自己开启新的事务执行,执行完成,恢复外层事务继续执行
 NOT_SUPPORTED: 不支持事务         如果外层存在事务,外层事务挂起,自己以非事务方式执行,执行完成,恢复外部事务执行
 NEVER: 不能有事务         存在事务报错
 MANDATORY: 强制事务           没有事务报错
 NESTED   : 嵌套事务           事务之间可以嵌套运行 数据库 oracle mysql 不支持
isolation   : 事务隔离级别
DEFAULT:            使用数据库默认的隔离级别  [推荐]
READ_UNCOMMITTED:   读未提交  一个客户端读到了另一个客户端没有提交的数据  脏读现象
READ_COMMITTED  :   读提交    一个客户端只能读到另一个客户端提交的数据   避免脏读现象 oracle
REPEATABLE_READ :   可重复读  主要是用来避免不可重复读现象出现   行锁  mysql
SERIALIZABLE    :   序列化读  主要是用来避免幻影读现象出现      表锁
  注意: 隔离级别越高,查询效率越低 一般推荐使用数据库默认隔离级别
 read-only :事务读写性  true 只读 不能执行增删改操作 false:可读可写(mysql支持 oralce不支持)
rollback-for: 出现什么类型异常回滚  默认出现RuntimeException 及其子类异常回滚
no-rollback-for: 出现什么类型异常不会滚  java.lang.RuntimeException
timeout:  事务超时性  -1  永不超时
           设置>=0正整数  代表设置超时时间 单位 1秒
            -->
            <tx:method name="save*"  />
            <tx:method name="update*"/>
            <tx:method name="delete*"/>
            <tx:method name="find*" propagation="SUPPORTS"/>
        </tx:attributes>
    </tx:advice>
    <!--配置事务切面-->
    <aop:config>
        <aop:pointcut id="pc" expression="execution(* com.service.*ServiceImpl.*(..))"/>
        <aop:advisor advice-ref="txAdvice" pointcut-ref="pc"/>
    </aop:config>
    <!--管理service层组件-->
    <bean id="userService" class="com.service.UserServiceImpl">
        <property name="userDAO" ref="userDAO"/>
    </bean>
    <bean id="aService" class="com.service.AServiceImpl">
        <property name="bbbbService" ref="bService"/>
    </bean>
    <bean id="bService" class="com.service.BServiceImpl"></bean>
</beans>


一、Spring事务传播属性(Propagation):


0) 事务的四个关键属性(ACID)


原子性:事务是一个原子操作,由一系列动作组成。事务的原子性确保动作要么完成要么都不完成


一致性:事务被提交后,数据和资源就处于一种满足业务规则的一致性状态中。


隔离性:可能有许多事务会同时处理相同的数据,因此要求每个事务都与其他事务隔离起来,防止数据损坏


持久性:事务一旦完成,无论发生系统错误,它的结果都不会受到影响。(事务结果被写道持久化存储器中)


1) REQUIRED(默认属性)需要事务

如果存在一个事务,则支持当前事务。如果没有事务则开启一个新的事务。

被设置成这个级别时,会为每一个被调用的方法创建一个逻辑事务域。如果前面的方法已经创建了事务,那么后面的方法支持当前的事务,如果当前没有事务会重新建立事务。


2) MANDATORY 支持事务

支持当前事务,如果当前没有事务,就抛出异常。


3) NEVER 不能有事务

以非事务方式执行,如果当前存在事务,则抛出异常。


4) NOT_SUPPORTED 不支持事务

以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。


5) REQUIRES_NEW 每次开启新的事务

新建事务,如果当前存在事务,把当前事务挂起。


6) SUPPORTS 支持事务

支持当前事务,如果当前没有事务,就以非事务方式执行。


7) NESTED 嵌套事务

支持当前事务,新增Savepoint点,与当前事务同步提交或回滚。

嵌套事务一个非常重要的概念就是内层事务依赖于外层事务。外层事务失败时,会回滚内层事务所做的动作。而内层事务操作失败并不会引起外层事务的回滚。


PROPAGATION_NESTED 与PROPAGATION_REQUIRES_NEW的区别:

它们非常类似,都像一个嵌套事务,如果不存在一个活动的事务,都会开启一个新的事务。


使用PROPAGATION_REQUIRES_NEW时,内层事务与外层事务就像两个独立的事务一样,一旦内层事务进行了提交后,外层事务不能对其进行回滚。两个事务互不影响。两个事务不是一个真正的嵌套事务。同时它需要JTA 事务管理器的支持。

使用PROPAGATION_NESTED时,外层事务的回滚可以引起内层事务的回滚。而内层事务的异常并不会导致外层事务的回滚,它是一个真正的嵌套事务。


二、Spring事务隔离级别(Isolation Level):


1.首先说明一下事务并发引起的三种情况:


1) Dirty Reads 脏读


一个事务正在对数据进行更新操作,但是更新还未提交,另一个事务这时也来操作这组数据,并且读取了前一个事务还未提交的数据,而前一个事务如果操作失败进行了回滚,后一个事务读取的就是错误数据,这样就造成了脏读。


2) Non-Repeatable Reads 不可重复读

一个事务多次读取同一数据,在该事务还未结束时,另一个事务也对该数据进行了操作,而且在第一个事务两次次读取之间,第二个事务对数据进行了更新,那么第一个事务前后两次读取到的数据是不同的,这样就造成了不可重复读。


3) Phantom Reads 幻像读


第一个数据正在查询符合某一条件的数据,这时,另一个事务又插入了一条符合条件的数据,第一个事务在第二次查询符合同一条件的数据时,发现多了一条前一次查询时没有的数据,仿佛幻觉一样,这就是幻像读。


非重复度和幻像读的区别:

非重复读是指同一查询在同一事务中多次进行,由于其他提交事务所做的修改或删除,每次返回不同的结果集,此时发生非重复读。

幻像读是指同一查询在同一事务中多次进行,由于其他提交事务所做的插入操作,每次返回不同的结果集,此时发生幻像读。

表面上看,区别就在于非重复读能看见其他事务提交的修改和删除,而幻像能看见其他事务提交的插入。


2.隔离级别:

1) DEFAULT (默认)

这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别。另外四个与JDBC的隔离级别相对应。


2) READ_UNCOMMITTED (读未提交)

这是事务最低的隔离级别,它允许另外一个事务可以看到这个事务未提交的数据。这种隔离级别会产生脏读,不可重复读和幻像读。


3) READ_COMMITTED (读已提交)

保证一个事务修改的数据提交后才能被另外一个事务读取,另外一个事务不能读取该事务未提交的数据。这种事务隔离级别可以避免脏读出现,但是可能会出现不可重复读和幻像读。


4) REPEATABLE_READ (可重复读)

这种事务隔离级别可以防止脏读、不可重复读,但是可能出现幻像读。它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了不可重复读。


5) SERIALIZABLE(串行化)

这是花费最高代价但是最可靠的事务隔离级别,事务被处理为顺序执行。除了防止脏读、不可重复读外,还避免了幻像读。

隔离级别解决事务并行引起的问题:


96.png


三、 读写和异常性


 readonly 
   true:    本次事务只读
  false:   本次事务非只读
  <tx:method name="save*" propagation="REQUIRES_NEW" read-only="true|false" isolation="SERIALIZABLE"/>
 rollback-for && no-rollback-for=""
    rollback-for: 遇到什么类异常回滚
    no-rollback-for: 遇到什么类异常不回滚
    <tx:method name="save*" rollback-for="" no-rollback-for="" propagation="REQUIRES_NEW" read-only="true" isolation="SERIALIZABLE"/>


1) timeout 超时性


  timeout: -1 永不超时
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
目录
相关文章
|
22天前
|
SQL Java 关系型数据库
Spring事务传播机制:7种姿势教你玩转"事务接力赛"
事务传播机制是Spring框架中用于管理事务行为的重要概念,它决定了在方法调用时事务如何传递与执行。通过7种传播行为,开发者可以灵活控制事务边界,适应不同业务场景。例如:REQUIRED默认加入或新建事务,REQUIRES_NEW独立开启新事务,NESTED支持嵌套回滚等。合理使用传播机制不仅能保障数据一致性,还能提升系统性能与健壮性。掌握这“七种人格”,才能在复杂业务中游刃有余。
|
2月前
|
Java 关系型数据库 数据库
深度剖析【Spring】事务:万字详解,彻底掌握传播机制与事务原理
在Java开发中,Spring框架通过事务管理机制,帮我们轻松实现了这种“承诺”。它不仅封装了底层复杂的事务控制逻辑(比如手动开启、提交、回滚事务),还提供了灵活的配置方式,让开发者能专注于业务逻辑,而不用纠结于事务细节。
|
7月前
|
Java 关系型数据库 数据库
微服务——SpringBoot使用归纳——Spring Boot事务配置管理——常见问题总结
本文总结了Spring Boot中使用事务的常见问题,虽然通过`@Transactional`注解可以轻松实现事务管理,但在实际项目中仍有许多潜在坑点。文章详细分析了三个典型问题:1) 异常未被捕获导致事务未回滚,需明确指定`rollbackFor`属性;2) 异常被try-catch“吃掉”,应避免在事务方法中直接处理异常;3) 事务范围与锁范围不一致引发并发问题,建议调整锁策略以覆盖事务范围。这些问题看似简单,但一旦发生,排查难度较大,因此开发时需格外留意。最后,文章提供了课程源代码下载地址,供读者实践参考。
140 0
|
7月前
|
Java 关系型数据库 数据库
微服务——SpringBoot使用归纳——Spring Boot事务配置管理——Spring Boot 事务配置
本文介绍了 Spring Boot 中的事务配置与使用方法。首先需要导入 MySQL 依赖,Spring Boot 会自动注入 `DataSourceTransactionManager`,无需额外配置即可通过 `@Transactional` 注解实现事务管理。接着通过创建一个用户插入功能的示例,展示了如何在 Service 层手动抛出异常以测试事务回滚机制。测试结果表明,数据库中未新增记录,证明事务已成功回滚。此过程简单高效,适合日常开发需求。
934 0
|
7月前
|
Java 数据库 微服务
微服务——SpringBoot使用归纳——Spring Boot事务配置管理——事务相关
本文介绍Spring Boot事务配置管理,阐述事务在企业应用开发中的重要性。事务确保数据操作可靠,任一异常均可回滚至初始状态,如转账、购票等场景需全流程执行成功才算完成。同时,事务管理在Spring Boot的service层广泛应用,但根据实际需求也可能存在无需事务的情况,例如独立数据插入操作。
153 0
|
5月前
|
人工智能 Java 数据库连接
Spring事务失效场景
本文深入探讨了Spring框架中事务管理可能失效的几种常见场景及解决方案,包括事务方法访问级别不当、方法内部自调用、错误的异常处理、事务管理器或数据源配置错误、数据库不支持事务以及不合理的事务传播行为或隔离级别。通过合理配置和正确使用`@Transactional`注解,开发者可以有效避免这些问题,确保应用的数据一致性和完整性。
241 10
|
4月前
|
Java 关系型数据库 MySQL
【Spring】【事务】初学者直呼学会了的Spring事务入门
本文深入解析了Spring事务的核心概念与使用方法。Spring事务是一种数据库事务管理机制,通过确保操作的原子性、一致性、隔离性和持久性(ACID),维护数据完整性。文章详细讲解了声明式事务(@Transactional注解)和编程式事务(TransactionTemplate、PlatformTransactionManager)的区别与用法,并探讨了事务传播行为(如REQUIRED、REQUIRES_NEW等)及隔离级别(如READ_COMMITTED、REPEATABLE_READ)。
304 1
|
7月前
|
Java 数据库 微服务
微服务——SpringBoot使用归纳——Spring Boot中的项目属性配置——指定项目配置文件
在实际项目中,开发环境和生产环境的配置往往不同。为简化配置切换,可通过创建 `application-dev.yml` 和 `application-pro.yml` 分别管理开发与生产环境配置,如设置不同端口(8001/8002)。在 `application.yml` 中使用 `spring.profiles.active` 指定加载的配置文件,实现环境快速切换。本节还介绍了通过配置类读取参数的方法,适用于微服务场景,提升代码可维护性。课程源码可从 [Gitee](https://gitee.com/eson15/springboot_study) 下载。
238 0
|
7月前
|
Java 微服务 Spring
微服务——SpringBoot使用归纳——Spring Boot中的项目属性配置——少量配置信息的情形
在微服务架构中,随着业务复杂度增加,项目可能需要调用多个微服务。为避免使用`@Value`注解逐一引入配置的繁琐,可通过定义配置类(如`MicroServiceUrl`)并结合`@ConfigurationProperties`注解实现批量管理。此方法需在配置文件中设置微服务地址(如订单、用户、购物车服务),并通过`@Component`将配置类纳入Spring容器。最后,在Controller中通过`@Resource`注入配置类即可便捷使用,提升代码可维护性。
104 0
|
监控 Java 数据库
Spring事务相关配置、案例:转账业务追加日志及事务传播行为
Spring事务相关配置、案例:转账业务追加日志及事务传播行为
160 0