事务知识点汇总(纯理论)
作者:互联网
问题背景
上次处理完事务问题后,我又想起来事务在spring中的传播属性已经不记得了,类似的概念性问题即便看过了也很容易忘(头疼.gif),所以把常见的事务问题整理了一下,记录在此。
什么是事务
事务是由一步或几步数据库操作序列组成的逻辑单元。这系列操作要么全部执行,要么全部放弃执行。
简单来说就是我们把一件事用多条sql语句表示,但是这件事要么是完成了,要么是失败了。事务就是保证这件事(多条sql语句)保持在同时成功或者失败的状态,不会出现中间状态,即成功了一半失败了一半。
事务的特性ACID
ACID即:Atomicity(原子性)、Consistency(稳定性)、Isolation(隔离性)、Durability(可靠性)。
原子性: 确保工作单元内的所有操作都成功完成,否则所有操作将回滚到以前的状态。
一致性: 确保数据库正确地改变状态后,成功提交的事务。
隔离性: 使事务操作彼此独立的和透明的。事务独立运行。一个事务处理后的结果,影响了其他事务,那么其他事务会撤回。事务的100%隔离,需要牺牲速度。
持久性: 确保提交的事务的结果或效果的系统出现故障的情况下仍然存在。
事务的并发读问题
- 脏读(dirty read):读到另一个事务的未提交更新数据,即读取到了脏数据;
- 不可重复读(unrepeatable read):对同一记录的两次读取不一致,因为另一事务对该记录做了修改;
- 幻读(虚读)(phantom read):对同一张表的两次查询不一致,因为另一事务插入或删除了一条记录;
注意: 幻读和不可重复读都是读取了另一条已经提交的事务,脏读读取的是未提交的事务;幻读读取的是批量数据,而不可重复读读取的是某一条数据。
事务的四大隔离级别
了解了事务的并发读问题,那么就需要了解如何应对这些问题。针对这些问题,我们有四种不同的解决方案(即四种事务的隔离级别)。不同事务隔离级别能够解决的数据并发问题的能力是不同的。
-
SERIALIZABLE(串行化)
不会出现任何并发问题,因为它是对同一数据的访问是串行的,非并发访问的;
性能最差; -
REPEATABLE READ(可重复读)(MySQL默认使用)
防止脏读和不可重复读,不能处理幻读问题;
性能比SERIALIZABLE好 -
READ COMMITTED(读已提交数据)(Oracle默认使用)
防止脏读,没有处理不可重复读,也没有处理幻读;
性能比REPEATABLE READ好 -
READ UNCOMMITTED(读未提交数据)
可能出现任何事务并发问题
性能最好
JDBC设置事务隔离级别
con. setTransactionIsolation(int level)
参数可选值如下:
- Connection.TRANSACTION_READ_UNCOMMITTED;
- Connection.TRANSACTION_READ_COMMITTED;
- Connection.TRANSACTION_REPEATABLE_READ;
- Connection.TRANSACTION_SERIALIZABLE。
在spring中事务的设置我截至目前还没有操作过,一直使用的默认配置
spring七个事务传播行为:
所谓事务的传播行为是指,如果在开始当前事务之前,一个事务上下文已经存在,此时有若干选项可以指定一个事务性方法的执行行为。
例如:方法可能继续在现有事务中运行,也可能开启一个新事务,并在自己的事务中运行。Spring定义了七种传播行为:
-
保证在同一事务内:
1.PROPAGATION_REQUIRED – 支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择,也是默认的选择。2.PROPAGATION_SUPPORTS – 支持当前事务,如果当前没有事务,就以非事务方式执行。
3.PROPAGATION_MANDATORY – 支持当前事务,如果当前没有事务,就抛出异常。
-
保证没有在同一事务内:
4.PROPAGATION_REQUIRES_NEW – 新建事务,如果当前存在事务,把当前事务挂起。5.PROPAGATION_NOT_SUPPORTED – 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
6.PROPAGATION_NEVER – 以非事务方式执行,如果当前存在事务,则抛出异常。
7.PROPAGATION_NESTED – 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。
spring中五个隔离级别:
- ISOLATION_DEFAULT :这是默认的隔离级别设置,使用数据库默认的事务隔离级别.
以下四种隔离级别与jdbc四种隔离级别相对应 - ISOLATION_READ_UNCOMMITTED
- ISOLATION_READ_COMMITTED
- ISOLATION_REPEATABLE_READ
- ISOLATION_SERIALIZABLE
spring事务管理器
理解:
Spring并不直接管理事务,而是提供了事务管理器,他们将事务管理的职责委托给Hibernate或者JTA等持久化机制所提供的相关平台框架的事务来实现。
再者,使用Spring进行事务管理时,大多数都是采用声明式事务管理,此种方式对应用的影响最小,也是最符合非侵入式的轻量级容器的概念。
标签:知识点,事务,隔离,READ,汇总,PROPAGATION,当前,纯理论,级别 来源: https://blog.csdn.net/qq_36464947/article/details/101018813