问题

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. MySQL 【优化宝典】

    概述 为什么要优化 系统的吞吐量瓶颈往往出现在数据库的访问速度上 随着应用程序的运行,数据库的中的数据会越来越多,处理时间会相应变慢 数据是存放在磁盘上的,读写速度无法和内存相比 如何优化 设计数据库 ...

  2. 基于RabbitMQ和Swoole实现的一个完整的异步任务系统

    从最开始的使用redis实现的单进程消费的异步任务系统到加入swoole的多进程消费模式,现在,我们的异步任务系统终于又能迈进一步. 因为有了前面两个简单系统的经验,这回基于RabbitMQ的异步任务 ...

  3. Spring注解 - AOP 面向切面编程

    基本概念: AOP:Aspect Oriented Programming,即面向切面编程 指在程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程方式 前置通知(@Before):在目标 ...

  4. 【Weiss】【第04章】二叉搜索树例程

    [二叉搜索树] 随机生成时平均深度为logN,平均插入.删除和搜索时间都是O(logN). 可能存在的问题是数据不均衡,使树单边生长,极端情况下变成类似链表,最坏插入.删除.搜索时间O(N) 写这个例 ...

  5. ASP.NET WebApi实现Token验证

    记录笔记,在博客园中有很多实现Token的方法,这是我看过他们学到的,然后找到适合自己的解决方案,自己无聊总结一下学习经验写下的 WebApi后端接口实现Token验证 Token是在客户端频繁向服务 ...

  6. 我的MacbookPro进水了!维修过程记录

    电脑进水与解决方案 如果事情有变坏的可能,不管这种可能性有多小,它总会发生.---墨菲定律 进水过程 2020年03月21日日下午3点左右,不小心把水杯碰倒了,水通过电脑右侧的键盘处进入了大概有10毫 ...

  7. [剑指Offer]41.和为S的两个数字 VS 和为S的连续正数序列

    [剑指Offer]41 和为S的两个数字 VS 和为S的连续正数序列 Leetcode T1 Two Sum Given an array of integers, return indices of ...

  8. VsCode编辑器那些事

    1.怎么改成中文的? 按快捷键“Ctrl+Shift+P” 在框下点击“configur Display language" 会跳转至商店,选择插件下载“Chinese (Simplifie ...

  9. jmeter3.3 接口压测入门和软件下载

    Jmeter3.3软件下载地址 https://download.csdn.net/download/qq_36625806/11076556 简单的使用教程 1.启动Jmeter 双击jemeter ...

  10. 《JavaScript 模式》读书笔记(4)— 函数4

    这篇文章我们主要来学习下即时对象初始化.初始化时分支.函数属性-备忘模式以及配置对象.这篇的内容会有点多. 六.即时对象初始化 保护全局作用域不受污染的另一种方法,即时对象初始化模式.这种模式使用带有 ...