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 的事务管理器,它里面提供了我们常用的操作事务的方法。

1554628587457

注意:

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 是事务的定义信息对象,里面有如下方法:

1554628676150

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 接口提供的是事务具体的运行状态,方法介绍如下。
1554628857200

3 声明式事物

3.1 概念

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

3.2 开发步骤

1.引入事物管理器

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

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

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

1592807200564

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>

1591367291135

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注解

1592753041464

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注解

1592753041464

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 属性执行。 这是一个嵌套事务

要安装Docker并安装插件,可以按照以下步骤进行操作: 1. 首先,安装Docker。可以按照官方文档提供的步骤进行安装,或者使用适合您操作系统的包管理器进行安装。 2. 安装Docker Compose插件。可以使用以下方法安装: 2.1 下载指定版本的docker-compose文件: curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose 2.2 赋予docker-compose文件执行权限: chmod +x /usr/local/bin/docker-compose 2.3 验证安装是否成功: docker-compose --version 3. 在安装插件之前,可以测试端口是否已被占用,以避免编排过程中出错。可以使用以下命令安装netstat并查看端口号是否被占用: yum -y install net-tools netstat -npl | grep 3306 现在,您已经安装了Docker并安装了Docker Compose插件,可以继续进行其他操作,例如上传docker-compose.yml文件到服务器,并在服务器上安装MySQL容器。可以参考Docker的官方文档或其他资源来了解如何使用Docker和Docker Compose进行容器的安装和配置。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Docker安装docker-compose插件](https://blog.youkuaiyun.com/qq_50661854/article/details/124453329)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [Docker安装MySQL docker安装mysql 完整详细教程](https://blog.youkuaiyun.com/qq_40739917/article/details/130891879)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赵广陆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值