Spring Framework之事务管理

问题

一、事务是什么?html

二、事务的目的是什么?spring

数据库事务

​ Spring的事务管理底层基于数据库事务,因此在学习Spring事务以前,咱们须要先学习数据库事务。sql

事务的定义

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

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

事务的目的

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

事务的特性

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

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

  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]http://www.javashuo.com/article/p-ebdjhvai-da.html

[4]http://www.javashuo.com/article/p-ubezhkxh-cc.html

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

相关文章
相关标签/搜索