这里写目录标题
一、MVCC(多版本并发控制)
1.1、MVCC存在意义及定义
按照基本的思想,事务A读取某行记录,有另外的事务B更新行记录,可能会导致事务A读取到“半写或不一致”的数据。针对这个问题,最简单的方法就是加锁,但是这种效率比较低。
-------------------最佳的解决方法,使用MVCC可以解决上面问题。MVCC是不用加锁,它读取的是行的一个快照,其他事务的操作对本事务来说不可见的。
1.1.1、MVCC特性
(1)MVCC只支持RC(读取已提交)和RR(可重复读)隔离级别。
(2)MVCC能解决脏读、不可重复读问题,不能解决丢失更新问题和幻读问题。
(3)MVCC是用来解决读写操作之间的阻塞问题。使得在并发读写数据库时,可以做到在读操作时不用阻塞写操作,写操作也不用阻塞读操作,提高了数据库并发读写的性能。
1.1.2、MVCC实现的依赖
MVCC的实现主要依赖于数据库在每个表中添加的两个隐藏字段以及事务在查询时创建的快照(read view)和数据库的数据版本链(Undo log)。
每个表中添加的两个隐藏字段

DB_TRX_ID(6字节): 它是最近一次更新或者插入或者删除该行数据的事务ID(若是删除,则该行有一个删除位更新为已删除。但并不是真正的进行物理删除,当InnoDB丢弃为删除而编写的更新撤消日志记录时,它才会物理删除相应的行及其索引记录。此删除操作称为清除,速度非常快)
DB_ROLL_PTR(7字节):回滚指针,指向当前记录行的undo log信息(指向该数据的前一个版本数据)
事务在查询时创建的快照(read view)
在innodb 中每个SQL语句执行前都会得到一个read_view。这个快照记录了系统当前活跃事务id信息,用于做可见性判断:判断当前事务应该访问哪个版本的行数据。

1.1.3、MVCC可见性判断
Aÿ

本文详细介绍了MySQL的多版本并发控制(MVCC)和基于锁的并发控制(LBCC)机制。MVCC主要用于解决并发读写时的阻塞问题,尤其在RC和RR隔离级别下,通过快照读和回滚指针实现数据可见性判断。而LBCC则通过锁定数据以保证数据一致性,读写操作互斥。
最低0.47元/天 解锁文章
1699

被折叠的 条评论
为什么被折叠?



