17@MySQL数据库读现象详解(脏读、幻读、不可重复读)

文章目录

    • MySQL数据库读现象
    • 一、数据库的读现象
      • 1、脏读(dirty read):读取未提交数据
      • 【案列详解】
      • 2、不可重复读取 (nonrepeatable read):前后多次读取,数据内容不一致
      • 【案列详解】
      • 3、幻读(nonrepeatable read):前后多次读取,数据总量不一致
      • 【案列详解】
    • 二、不可重复读与幻读之间的区别
    • 三、事务的隔离级别
      • 1、读未提交(READ UNCOMMITTED)
      • 2、读已提交(READ COMMITTED)
      • 3、可重复读(REPEATABLE READ)
      • 4、可串行化(SERIALIZABLE)
      • 5、隔离级别的实现原理
    • 四、解决方案
      • 【MySQL解决幻读】
        • 【多版本控制(MVCC)的原理】
        • 【Next-Key锁(当前读)的原理】

MySQL数据库读现象

一、数据库的读现象

数据库管理软件的“读现象”指的是当多个事务并发执行时,在读取数据方面可能碰到的问题,包括有脏读、不可重复读和幻读

1、脏读(dirty read):读取未提交数据

一个事务读到了另一个未提交事务修改过的数据

【案列详解】

3、幻读(nonrepeatable read):前后多次读取,数据总量不一致

幻读是不可重复读的一种特殊情况, 当事务没有获取范围锁的情况下执行 select 操作可能会发生幻读现象

一个事务先根据某些条件查询出一些记录,之后另一个事务又向表中插入了符合这些条件的记录,原先的事务再次按照该条件查询时,能把另一个事务插入的记录也读出来。(幻读在读未提交、读已提交、可重复读隔离级别都可能会出现)

【案列详解】

2、读已提交(READ COMMITTED)

提问:为什么上了写锁(写操作),别的事务还可以读操作r> 因为InnoDB有MVCC机制(多版本并发控制),可以使用快照读,而不会被阻塞

4、可串行化(SERIALIZABLE)

5、隔离级别的实现原理

四、解决方案

其实,脏写、脏读、不可重复读、幻读,都是因为业务系统会多线程并发执行,每个线程可能都会开启一个事务,每个事务都会执行增删改查操作。
然后数据库会并发执行多个事务,多个事务可能会并发地对缓存页里的同一批数据进行增删改查操作,
于是这个并发增删改查同一批数据的问题,可能就会导致我们说的脏写、脏读、不可重复读、幻读这些问题。

所以这些问题的本质,都是数据库的多事务并发问题

那么为了解决多事务并发带来的脏读、不可重复读、幻读等读等问题,数据库才设计了锁机制、事务隔离机制、MVCC 多版本隔离机制,用一整套机制来解决多事务并发问题

【MySQL解决幻读】

在高并发的情况下,我们要保证数据的一致性和事务与事务之间的隔离性
1)多版本控制(MVCC)
2)Next-Key锁(当前读)

【多版本控制(MVCC)的原理】

【Next-Key锁(当前读)的原理】

将当前数据行与上一条数据和下一条数据之间的间隙锁定,保证此范围内读取数据是一致的

文章知识点与官方知识档案匹配,可进一步学习相关知识MySQL入门技能树SQL高级技巧CTE和递归查询33031 人正在系统学习中

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2021年6月11日
下一篇 2021年6月11日

相关推荐