Spring进阶事物的传播行为

简介: Spring进阶事物的传播行为

1 事物知识点回顾

1.1 事物的四个特征

原子性(Atomicity)指事务是一个不可分割的整体,其中的操作要么全执行或全不执行

一致性(Consistency)事务前后数据的完整性必须保持一致

隔离性(Isolation)事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离


持久性(Durability)持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其任何影响

1.2 事物的四个隔离级别

读未提交(read-uncommitted) ,会造成脏读

不可重复读(read-committed) ,会造成不可重复度 oracle默认

可重复读(repeatable-read) ,会造成幻读 mysql默认

串行化(serializable)

脏读:表示读取未提交的数据,解决方案 read commited

不可重复度:两次读取到的数据不一致,原因是你在读取的时候,别人修改。解决方案 repeatable-read

幻读:两次读取到的数据条数不一致,原因是你在读取的时候,别人添加或者删除了数据。解决方案serializable

2 编程式事务控制相关对象

2.1 PlatformTransactionManager

PlatformTransactionManager 接口是 spring 的事务管理器,它里面提供了我们常用的操作事务的方法。

注意:


PlatformTransactionManager 是接口类型,不同的 Dao 层技术则有不同的实现类,例如:Dao 层技术是jdbc 或 mybatis 时:org.springframework.jdbc.datasource.DataSourceTransactionManager


Dao 层技术是hibernate时:org.springframework.orm.hibernate5.HibernateTransactionManager


DataSourceTransactionManager 适用于Spring JDBC或MyBatis

HibernateTransactionManager 适用于Hibernate3.0及以上版本

JpaTransactionManager 适用于JPA

JdoTransactionManager 适用于JDO

JtaTransactionManager 适用于JTA

2.2 TransactionDefinition

TransactionDefinition 是事务的定义信息对象,里面有如下方法:

2.3 事务隔离级别

设置隔离级别,可以解决事务并发产生的问题,如脏读、不可重复读和虚读。

  • ISOLATION_DEFAULT
  • ISOLATION_READ_UNCOMMITTED
  • ISOLATION_READ_COMMITTED
  • ISOLATION_REPEATABLE_READ
  • ISOLATION_SERIALIZABLE

2.4 事务传播行为(机制)

  • REQUIRED:如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。一般的选择(默认值)

SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行(没有事务)

MANDATORY:使用当前的事务,如果当前没有事务,就抛出异常

REQUERS_NEW:新建事务,如果当前在事务中,把当前事务挂起。

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

NEVER:以非事务方式运行,如果当前存在事务,抛出异常

NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行 REQUIRED 类似的操作

超时时间:默认值是-1,没有超时限制。如果有,以秒为单位进行设置

是否只读:建议查询时设置为只读

一般查询这种的不需要事务就是supports,增删改默认即可,剩下看具体业务在定夺.

2.5 事务隔离级别和事务传播行为(机制)个人理解

事务隔离级别针对的是这一个事务的数据展现,而事务的传播行为相当于一类事务对于其关联的产生的影响后做出的处理.

2.6 TransactionStatus

TransactionStatus 接口提供的是事务具体的运行状态,方法介绍如下。

3 声明式事物

3.1 概念

声明式事物 = AOP+编程式事物

3.2 开发步骤

1.引入事物管理器

2.配置哪些方法使用事物

3.将通知类 和 切入点表达式结合 配置成切面(通知类是框架提供的)

3.3 XML配置声明式事务的开发步骤

3.3.1 配置平台事物管理器

<!--配置平台事务管理器,不同框架底层操作事务的方式是不一样的,spring默认是不知道底层使用什么框架,所以我们要配一下平台管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
</bean>

3.3.2 为spring提供的通知配置对应的配置信息,指定哪些方法需要被如何增强

<!--spring对于事物的配置信息,用于配置要增强的方法-->
<tx:advice transaction-manager="dataSourceTransactionManager" id="transactionInterceptor">
    <tx:attributes>
        <tx:method name="find*" isolation="DEFAULT" read-only="true" propagation="REQUIRED" />
    </tx:attributes>
</tx:advice>

c373d6b133561e76907a87688d29df07.png

3.3.3 将spring提供的通知和切点织到一块

<aop:config>
    <aop:advisor advice-ref="transactionInterceptor" pointcut="execution(* cn.oldlu.service..*.*(..))"></aop:advisor>
</aop:config>

3.4 半注解配置声明式事务的开发步骤

1.开启扫描

2.开启支持事物注解的驱动<tx:annotation-driven transaction-

manager="dataSourceTransactionManager"></tx:annotation-driven>

3.Service层加@Service,要使用事物的方法加@Transactional

3.4.1 配置平台事物管理器

<!--配置平台事务管理器,不同框架底层操作事务的方式是不一样的,spring默认是不知道底层使用什么框架,所以我们要配一下平台管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
</bean>

3.4.2 在需要启用事务的方法或者类上加@Transactional注解

3.4.3 启用注解配置事务

<tx:annotation-driven></tx:annotation-driven>
<!-- 如果上面配置不起作用加该属性 -->
<tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>

3.5 全注解配置声明式事务的开发步骤

3.5.1 配置平台事物管理器

package cn.oldlu.config;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import javax.sql.DataSource;
public class TMConfig {
    @Bean
    public SqlSessionFactoryBean sqlSessionFactoryBean(@Autowired DataSource dataSource){
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource);
        sqlSessionFactoryBean.setTypeAliasesPackage("cn.oldlu.domain");
        return sqlSessionFactoryBean;
    }
    @Bean
    public MapperScannerConfigurer mapperScannerConfigurer(){
        MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
        mapperScannerConfigurer.setBasePackage("cn.oldlu.dao");
        return mapperScannerConfigurer;
    }
}

3.5.2 需要启用事务的方法或者类上加@Transactional注解

3.5.3 启用注解配置事务

package cn.oldlu.config;
import org.springframework.context.annotation.*;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@Configuration
@ComponentScan("cn.oldlu")
@EnableAspectJAutoProxy
@EnableTransactionManagement
@Import({DBConfig.class,MyBatisConfig.class,TMConfig.class})
public class SpringConfig {
}

4 面试题

4.1 事物的四大特性ACID分别是什么

  1. 原子性
  2. 一致性
  3. 隔离性
  4. 持久性

4.2 事物的四个隔离级别是什么,mysql默认哪个隔离级别

  1. 脏读 读取未提交的数据
  2. 不可重复读 ,读已经提交的数据,读的时候允许别的事物修改,导致两次读取到数据不一样
  3. 幻读 读取已经提交的数据,读取的时候允许别的事物增删,导致两次读取到的数据个数不一样
  4. 串行化

mysql默认的是Repeatable

4.3 事物的传播行为(机制)有哪些

默认是REQUIRED

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


REQUIRES_NEW:它会开启一个新的事务。如果一个事务已经存在,则先将这个存在的事务挂起。


SUPPORTS:如果存在一个事务,支持当前事务。如果没有事务,则非事务的执行。


NOT_SUPPORTED:总是非事务地执行,并挂起任何存在的事务。


MANDATORY:如果已经存在一个事务,支持当前事务。如果没有一个活动的事务,则抛出异常。


NEVER:总是非事务地执行,如果存在一个活动事务,则抛出异常。


NESTED:如果一个活动的事务存在,则运行在一个嵌套的事务中。 如果没有活动事务, 则按TransactionDefinition.PROPAGATION_REQUIRED 属性执行。 这是一个嵌套事务

目录
相关文章
|
Java 开发者 Spring
Spring高手之路24——事务类型及传播行为实战指南
本篇文章深入探讨了Spring中的事务管理,特别是事务传播行为(如REQUIRES_NEW和NESTED)的应用与区别。通过详实的示例和优化的时序图,全面解析如何在实际项目中使用这些高级事务控制技巧,以提升开发者的Spring事务管理能力。
563 1
Spring高手之路24——事务类型及传播行为实战指南
|
Java 关系型数据库 数据库
京东面试:聊聊Spring事务?Spring事务的10种失效场景?加入型传播和嵌套型传播有什么区别?
45岁老架构师尼恩分享了Spring事务的核心知识点,包括事务的两种管理方式(编程式和声明式)、@Transactional注解的五大属性(transactionManager、propagation、isolation、timeout、readOnly、rollbackFor)、事务的七种传播行为、事务隔离级别及其与数据库隔离级别的关系,以及Spring事务的10种失效场景。尼恩还强调了面试中如何给出高质量答案,推荐阅读《尼恩Java面试宝典PDF》以提升面试表现。更多技术资料可在公众号【技术自由圈】获取。
|
JSON 前端开发 Java
【JavaEE进阶】 关于Spring MVC 响应
【JavaEE进阶】 关于Spring MVC 响应
239 3
|
数据采集 Java 程序员
【JavaEE进阶】 Spring AOP快速上手
【JavaEE进阶】 Spring AOP快速上手
|
Java Spring
【JavaEE进阶】 Spring AOP源码简单剖析
【JavaEE进阶】 Spring AOP源码简单剖析
|
Java Spring
【JavaEE进阶】 Spring AOP详解
【JavaEE进阶】 Spring AOP详解
|
Java 关系型数据库 MySQL
Spring 事务和事务传播机制
Spring 事务和事务传播机制
|
Java 数据库 Spring
Spring 事务 (编程式 & 声明式, Spring 事务传播机制)
Spring 事务 (编程式 & 声明式, Spring 事务传播机制)
302 1
|
Java 关系型数据库 MySQL
Spring 事务和事务传播机制
Spring 事务和事务传播机制
Spring 事务和事务传播机制
|
XML Java 数据格式
进阶注解探秘:深入Spring高级注解的精髓与实际运用
进阶注解探秘:深入Spring高级注解的精髓与实际运用
323 2