1、事务是什么?
2、事务的目的是什么?
? Spring的事务管理底层基于数据库事务,所以在学习Spring事务之前,我们需要先学习数据库事务。
? 事务是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。(来自维基百科)
? 简单翻译就是将数据资源进行访问的分步操作组合成一个整体操作,这一整体执行单元就是事务。
? 事务的目的是保证数据的一致性。
? 要保证分步操作组合成一个整体操作时整体成功或整体失败(同生共死)。就需要有严格的定义。
事务的4种特性(ACID):原子性(Atomicity)、一致性(Consistency)、隔离性(IsoLation)、持久性(Durability)。
出现脏读的原因:"select"操作没有限制
出现不可重复读的原因:“update”操作没有限制
出现幻读的原因:“insert”和“delete”操作没有限制
? 快照读基于MVCC和 undo log实现,适用于简单的select语句。MVCC 并发版本控制,是靠 ReadView (事务视图) 来实现的。
读已提交:事务中每一条SQL都会生成一个ReadView。在执行查询操作时都会读取最新ReadView中的值。
可重复读:事务开始时会生成一个ReadView。事务中的多条SQL都会读取到同一个ReadView。在多条SQL查询时也会读取同一个ReadView中的值。
? Spring为事务管理提供统一的编程模板,在高层次建立统一的事务抽象。
? 用于描述事务的隔离级别、超时时间、是否为读取事务以及事务的传播规则等控制事务的具体属性。
事务隔离级别
? 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中以秒为默认单位。
? 事务只对事务资源进行读操作,不修改任何数据。如果只对事务资源数据进行读取操作,可以设置为只读状态,以提升运行性能。
? 用于定义回滚与不会滚的对应异常。默认情况下事务在运行期遇到特定异常时才回滚。
? 用于表示事务的具体运行状态。事务管理器能够通过该接口获取事务运行期的状态信息,也可以通过该接口间接地回滚事务,相比于在抛出异常时事务回滚更有意义。
? 事务管理器,提供事务提交、回滚以及根据事务定义信息从事务环境中返回一个已经存在的事务或创建一个新事务。
<!-- 事务管理器 -->
<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 企业应用开发实战》
原文:https://www.cnblogs.com/boycelee/p/12688939.html