mysql|MySQL数据库的核心MVCC详解


mysql|MySQL数据库的核心MVCC详解
文章插图

??本文给大家详细的类介绍下MVCC的内容,MVCC对大家的工作和面试都是非常重要的内容。
一、前置内容
1.ACID
??在看MVCC之前我们先补充些基础内容,首先来看下事务的ACID。


mysql|MySQL数据库的核心MVCC详解
文章插图

2.MySQL的核心日志
??在MySQL数据库中有三个非常重要的日志binlog,undolog,redolog.


mysql|MySQL数据库的核心MVCC详解
文章插图
举例演示为:


3.隔离级别
??MySQL的事务隔离级别有四个,分别为:
??事务隔离级别指的是一个事务对数据的修改与另一个并行的事务的隔离程度,当多个事务同时访问相同数据时,如果没有采取必要的隔离机制,就可能发生以下问题:
问题描述脏读一个事务读到另一个事务未提交的更新数据,所谓脏读,就是指事务A读到了事务B还没有提交的数据,比如银行取钱,事务A开启事务,此时切换到事务B,事务B开启事务-->取走100元,此时切换回事务A,事务A读取的肯定是数据库里面的原始数据,因为事务B取走了100块钱,并没有提交,数据库里面的账务余额肯定还是原始余额,这就是脏读幻读是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象 发生了幻觉一样。不可重复读在一个事务里面的操作中发现了未被操作的数据 比方说在同一个事务中先后执行两条一模一样的select语句,期间在此次事务中没有执行过任何DDL语句,但先后得到的结果不一致,这就是不可重复读隔离级别描述READ_UNCOMITTED读未提交(脏读)最低的隔离级别,一切皆有可能。READ_COMMITED读已提交,ORACLE默认隔离级别,有幻读以及不可重复读风险。REPEATABLE_READ可重复读,解决不可重复读的隔离级别,但还是有幻读风险。SERLALIZABLE串行化,最高的事务隔离级别,不管多少事务,挨个运行完一个事务的所有子事务之后才可以执行另外一个事务里面的所有子事务,这样就解决了脏读、不可重复读和幻读的问题了
mysql|MySQL数据库的核心MVCC详解
文章插图
在这里插入图片描述数据库的并发场景:

  • 读读:不会存在任何问题,也不需要并发控制
  • 读写:有线程安全问题,可能会造成事务隔离性问题,可能遇到脏读,幻读,不可重复读,需要MVCC控制
  • 写写:有线程安全问题,可能会存在更新丢失问题,比如第一类更新丢失,第二类更新丢失
二、MVCC
1.什么是MVCC
??MVCC(Multi-Version Concurrency Control):多版本并发控制,是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内存。
??MVCC 在 MySQL InnoDB 中的实现主要是为了提高数据库并发性能,用更好的方式去处理读-写冲突,做到即使有读写冲突时,也能做到不加锁,非阻塞并发读。
2.什么是当前读和快照读
??在学习 MVCC 多版本并发控制之前,我们必须先了解一下,什么是 MySQL InnoDB 下的当前读和快照读。

mysql|MySQL数据库的核心MVCC详解
文章插图

推荐阅读