问题

1、事务是什么?

2、事务的目的是什么?

数据库事务

​ Spring的事务管理底层基于数据库事务,所以在学习Spring事务之前,我们需要先学习数据库事务。

事务的定义

​ 事务是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。(来自维基百科)

​ 简单翻译就是将数据资源进行访问的分步操作组合成一个整体操作,这一整体执行单元就是事务。

事务的目的

​ 事务的目的是保证数据的一致性。

事务的特性

​ 要保证分步操作组合成一个整体操作时整体成功或整体失败(同生共死)。就需要有严格的定义。

事务的4种特性(ACID):原子性(Atomicity)、一致性(Consistency)、隔离性(IsoLation)、持久性(Durability)。

  1. 原子性:同一事务的多个操作是不可分割的最小单元。当所有操作都执行成功时,才提交事务,否则撤销所有操作成功的操作并恢复数据库至初始状态。
  2. 一致性:提交事务后,数据结果与业务预期规则保持一致。例如A向B转账无论事务是否提交成功,两账户总额是不变的。
  3. 隔离性:并发操作时事务与事务间存在隔离,互不干扰,隔离性取决于数据库的隔离级别。
  4. 持久性:事务提交成功后,事务中的一系列操作将持久化至数据库中。

事务隔离级别

  1. 读未提交:一个事务可以读取另一个未提交的内容。可能会出现“脏读”、“不可重复读”、“幻读”。
  2. 读提交:一个事务只能读取到另一个数据已经提交成功的内容。可能会出现“不可重复读”、“幻读”。大部分数据库的默认隔离级别
  3. 可重复读:整个事务过程中多次对同一笔数据读取结果相同。可能会出现“幻读”。Mysql默认级别。
  4. 串行化:所有事务操作都必须按照顺序依次执行。最严格的隔离级别。

数据并发问题

  1. 脏读:事务1对数据进行更新,但未提交,但事务2能够读取到未提交的内容。当事务对更新未提交的数据进行回滚时,事务2之前读取到的。
  2. 不可重复读:同一事务对同一数据多次读取,每次读取结果不相同。事务1在事务2更新操作之前与之后分别读取一次数据,就会出现两个结果不同的情况。
  3. 幻读:同一事务对同一数据集合进行多次的查询,每次结果集不同。事务1在事务2插入或删除操作前后分别读取一次数据,其操作的结果集不相同。

出现脏读的原因:"select"操作没有限制

出现不可重复读的原因:“update”操作没有限制

出现幻读的原因:“insert”和“delete”操作没有限制

事务隔离级别对数据并发问题的作用

  1. 读未提交的作用:无作用。
  2. 读提交:使用“快照读”能避免“脏读”,但不能避免“不可重复读”、“幻读”。
  3. 可重复读:使用“快照读”能避免“脏读”、“不可重复读”,但不能避免“幻读”。
  4. 串行化:能避免“脏读”、“不可重复读”、“幻读”。

快照读

​ 快照读基于MVCC和 undo log实现,适用于简单的select语句。MVCC 并发版本控制,是靠 ReadView (事务视图) 来实现的。

读已提交:事务中每一条SQL都会生成一个ReadView。在执行查询操作时都会读取最新ReadView中的值。

可重复读:事务开始时会生成一个ReadView。事务中的多条SQL都会读取到同一个ReadView。在多条SQL查询时也会读取同一个ReadView中的值。

Spring事务管理

​ Spring为事务管理提供统一的编程模板,在高层次建立统一的事务抽象。

事务管理接口

TransactionDefinition

​ 用于描述事务的隔离级别、超时时间、是否为读取事务以及事务的传播规则等控制事务的具体属性。

事务隔离级别

​ TransactionDefinition中定义了五个表示隔离级别的常量:

​ (1)TransactionDefinition.ISOLATION_DEFAULT,表示使用数据库默认隔离界别(Oracle采用读提交,Mysql默认采用可重复读)

​ (2)TransactionDefinition.ISOLATION_READ_UNCOMMITTED,表示读未提交。

​ (3)TransactionDefinition.ISOLATION_READ_COMMITTED,表示读提交。

​ (4)TransactionDefinition.ISOLATION_REPEATABLE_READ,表示可重复读。

​ (5)TransactionDefinition.ISOLATION_SERIALIZABLE,表示串行化。

事务传播行为

​ 当某个事务被另一事务调用时,就需要指定事务传播。

​ TransactionDefinition.PROPAGATION_REQUIRED,如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务,这是最常见的选择。

​ TransactionDefinition.PROPAGATION_SUPPORTS, 如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。

​ TransactionDefinition.PROPAGATION_MANDATORY,如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。

事务超时

​ 超过事务被允许运行的时间,事务在规定时间未完成将自动回滚事务。TransactionDefinition中以秒为默认单位。

只读状态

​ 事务只对事务资源进行读操作,不修改任何数据。如果只对事务资源数据进行读取操作,可以设置为只读状态,以提升运行性能。

回滚规则

​ 用于定义回滚与不会滚的对应异常。默认情况下事务在运行期遇到特定异常时才回滚。

TransactionStatus

​ 用于表示事务的具体运行状态。事务管理器能够通过该接口获取事务运行期的状态信息,也可以通过该接口间接地回滚事务,相比于在抛出异常时事务回滚更有意义。

PlatformTransactionManager

​ 事务管理器,提供事务提交、回滚以及根据事务定义信息从事务环境中返回一个已经存在的事务或创建一个新事务。

<!-- 事务管理器 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- 数据源 -->
<property name="dataSource" ref="dataSource" />
</bean>

参考

[1]https://zh.wikipedia.org/wiki/数据库事务

[2]https://baijiahao.baidu.com/s?id=1611918898724887602&wfr=spider&for=pc

[3]https://www.cnblogs.com/AlmostWasteTime/p/11466520.html

[4]https://juejin.im/post/5b00c52ef265da0b95276091

[5]《精通Spring4.x 企业应用开发实战》

Spring Framework之事务管理的更多相关文章

  1. 框架应用:Spring framework (四) - 事务管理

    事务控制 事务是什么?事务控制? 事务这个词最早是在数据库中进行应用,讲的用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位. 事务的管理是指一个事务的开启,内容添加, ...

  2. Spring编程式事务管理及声明式事务管理

    本文将深入讲解 Spring 简单而强大的事务管理功能,包括编程式事务和声明式事务.通过对本教程的学习,您将能够理解 Spring 事务管理的本质,并灵活运用之. Spring 事务属性分析 事务管理 ...

  3. Spring声明式事务管理与配置介绍

    转至:http://java.9sssd.com/javafw/art/1215 [摘要]本文介绍Spring声明式事务管理与配置,包括Spring声明式事务配置的五种方式.事务的传播属性(Propa ...

  4. spring 声明式事务管理

    简单理解事务: 比如你去ATM机取5000块钱,大体有两个步骤:首先输入密码金额,银行卡扣掉5000元钱:然后ATM出5000元钱.这两个步骤必须是要么都执行要么都不执行.如果银行卡扣除了5000块但 ...

  5. Spring声明式事务管理基于@Transactional注解

    概述:我们已知道Spring声明式事务管理有两种常用的方式,一种是基于tx/aop命名空间的xml配置文件,另一种则是基于@Transactional 注解.         第一种方式我已在上文为大 ...

  6. Spring声明式事务管理基于tx/aop命名空间

    目的:通过Spring AOP 实现Spring声明式事务管理; Spring支持编程式事务管理和声明式事务管理两种方式. 而声明式事务管理也有两种常用的方式,一种是基于tx/aop命名空间的xml配 ...

  7. Spring对Hibernate事务管理

    谈Spring事务管理之前我们想一下在我们不用Spring的时候,在Hibernate中我们是怎么进行数据操作的.在Hibernate中 我们每次进行一个操作的的时候我们都是要先开启事务,然后进行数据 ...

  8. spring 编程式事务管理和声明式事务管理

    编程式事务管理 Spring 的编程式事务管理概述 在 Spring 出现以前,编程式事务管理对基于 POJO 的应用来说是唯一选择.用过 Hibernate 的人都知道,我们需要在代码中显式调用be ...

  9. Spring学习8-Spring事务管理

      http://blog.sina.com.cn/s/blog_7ffb8dd501014e0f.html   Spring学习8-Spring事务管理(注解式声明事务管理) 标签: spring注 ...

随机推荐

  1. 【ERROR 1064 (42000)】MySQL中使用mysqladmin或set修改root密码时提示语法错误

    报错信息: mysql> mysqladmin -uroot -p123456 password 654321; ERROR 1064 (42000): You have an error in ...

  2. redis 出现(error) MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details

    如果在ubuntu安装的redis含端口使用,但是某些时候常常出现 (error) MISCONF Redis is configured to save RDB snapshots, but is ...

  3. EF6.0 下sql语句自动生成的参数类型decimal(18,2)修改

    很多时候我们需要对插入到数据库的数据的精度做一个控制,例如sql server下保留6位小数使用numeric(10,6) .而到c#里对应的数据类型就是decimal ,但是使用EF6.0的crea ...

  4. 扩展el-input 加一个控制精度的命令(directives)

    使用el-input时 出现需要精度控制的需求,因为每一个el-input需要精度不用 所以我给这个虚拟dom绑定了一个精度值,根据这个值去控制精度. 下面附上代码: html: <el-inp ...

  5. turtle学习笔记续集

    turtle(海龟)是Python重要的标准库之一,它能够进行基本的图形绘制.turtle图形绘制的概念诞生于1969年,成功应用于LOGO编程语言. turtle库绘制图形有一个基本框架:一个小海龟 ...

  6. C# MP3播放帮助类

    本文为原创文章如需转载请注明出处: /// <summary> /// ************************************************* /// 类名:M ...

  7. 【Java】反射调用与面向对象结合使用产生的惊艳

    缘起 我在看Spring的源码时,发现了一个隐藏的问题,就是父类方法(Method)在子类实例上的反射(Reflect)调用. 初次看到,感觉有些奇特,因为父类方法可能是抽象的或私有的,但我没有去怀疑 ...

  8. linux入门系列19--数据库管理系统(DBMS)之MariaDB

    前面讲完Linux下一系列服务的配置和使用之后,本文简单介绍一款数据库管理系统(MySQL的兄弟)MariaDB. 如果你有MySQL或其他数据的使用经验,MariaDB使用起来将非常轻松. 本文讲解 ...

  9. ASP.NET Core 3.x 中间件流程与路由体系

    中间件分类 ASP.NET Core 中间件的配置方法可以分为以上三种,对应的Helper方法分别是:Run(), Use(), Map(). Run(),使用Run调用中间件的时候,会直接返回一个响 ...

  10. 解决vscode 没有 c++11 的代码提示(如to_string()等)

    2019.5.4 更新: 参考了stackflow上的一个问题:to_string is not a member of std, says g++ (mingw),发现直接换新版mingw即可- m ...