数据库隔离级别

157 阅读5分钟

当人们提及数据库,必然会提到事务、ACID特性以及事务隔离级别。

事务本身是为了保证系统运行状态最终将处于一致性(满足一组约束条件)的状态而出现的,其中ACID特性的I(Isonlation)保证在并发操作下数据库最终可以处于“一致”的状态。

事务四大特性ACID的I(Isonlation)意思是“隔离性”,实质上是指对数据操作的并发控制。

为什么需要并发控制?解决了什么问题?

如果对同一数据项的所有事务操作都被串行化的执行,执行结果是没有问题的。如果存在并发操作,即多个事务的生命周期之间存在交集,就可能出现操作上的冲突和依赖,进而出现异常。

对同一数据项,两个并发操作执行过程中一定有先后而非物理上的同时,其结果取决于争抢和调度策略。
操作类型可以分为 读-读 读-写 写-读 写-写 4种,其中后三种包含写的操作是有冲突的,可能引发执行结果的异常。

并发控制就是要解决上面这些异常情况,但是并发控制需要达到什么程度呢?

并发控制高意味着并发执行效率低,数据库操作并非时刻都需要最强都并发控制方式,这是一致性和并发度度权衡隔离级别就是这一权衡度控制参数

什么是事务隔离级别?为什么要有事务隔离级别

从数据库使用角度看,异常现象是并发操作可能出现的问题,并发控制是避免某些异常现象导致问题的过程或手段,隔离级别是对并发控制程度对抽象描述。数据库使用者通过设定事务隔离级别,来配置数据库,使之在并发操作时能规避某些异常现象。

常见现象异常现象集合普通现象
脏写 记录w-w冲突未定义A0P0:w1[x]...w2[x]
脏读 记录w-r冲突A1:w1[x]...r2[x]...a1 先写后读P1:w1[x]...r2[x] P1包含A1
不可重复读 记录r-w冲突A2:r1[x]...w2[x]...c2...r1[x] 先读后写P2:r1[x]...w2[x] P2包含A2
幻象 记录r-w冲突A3:r1[x]...w2[x in P]...c2...r1[P] 先读后写P3:r1[x]...w2[x in P] P3包含A3
写丢失 记录r-w-w冲突-P4:r1[x]...w2[x]...w1[x]...c1 P2包P4 先读后写
读倾斜 关联数据冲突A5AP4: P2包P4 先读后写
写倾斜 关联数据冲突A5BP4: P2包P4 先读后写

事务隔离级别(解决A1-A3的部分和全部异常)

Isolation Level(隔离级别)P1/A1 Dirty Read 脏读P2/A2 Fuzzy Read 不可重复读P3/A3 Phantom 幻读
Read UncommittedYYY
Read CommittedNYY
Repeatable ReadNNY
SerializableNNN

基于锁机制的隔离级别

  • RU

    RU级别做update等增删改操作时,仍然会默认在事务更新操作中增加排他锁,避免update冲突

  • RC

    LBCC基于锁的并发控制(Lock-Based Concurrency Control)) LBCC是采用悲观锁,事务操作查询时默认加锁

    MVCC基于多版本的并发控制协议(Multi-Version Concurrency Control) 尽可能不在读操作加锁,排他锁只对更新操作

  • RR MVCC 每次读时只使用事务B最开始拿到的那个readView,同一事务内不会拿多个版本,只会拿事务开始的第一个版本

MVCC如何做的
默认给每个数据行加了一个版本号列TRX_ID和回滚版本链ROLL_BT,
对于select读操作,统一默认不加锁,使用历史版本数据。
对于insert、update、delete操作,仍然需要加X锁,因为涉及了数据变更,必须使用最新数据进行修改
-   查的时候,只查当前事务之前的记录,或者回滚版本比当前大的已删记录。
-   增的时候,加新版本的记录
-   删的时候,把老记录标记上回滚版本
-   改的时候,本质上是加新记录, 同时把老记录标上回滚版本

image.png

RR怎么解决2次update中 insert 的幻读情况呢

RR级别会启用一个叫“间隙锁”(Cap锁)来处理,在每个更新操作行的间隙都会加一个间隙锁,
保证订单插入时被update的间隙锁拦住
不可重复读和幻读的区别和联系是什么?

不可重复读是针对单条数据

幻读是针对数据集合的不可重复读现象 插入新数据导入集合不可重复读。

因为增/删/改数据记录而导致的给定条件下的数据集合的不可重复读。

例如: SELECT id FROM t WHERE cond;
在RU隔离级别下,通过WHERE条件相关的数据记录进行增/删/改,即可改变查询结果集。
需要改变的数据记录是要引起cond判定的变化的,否则并不能影响查询结果。

比如 INSERT一个满足cond的key值,UPDATE一个key值(其旧有或目标key值满足cond),
DELETE一个key值,都可以改变满足cond的查询结果集。

image.png

image.png