程序员的公众号:源1024,获取更多资料,无加密无套路!
最近整理了一波电子书籍资料,包含《Effective Java中文版 第2版》《深入JAVA虚拟机》,《重构改善既有代码设计》,《MySQL高性能-第3版》,《Java并发编程实战》等等
获取方式: 关注公众号并回复 电子书 领取,更多内容持续奉上
MVCC(Multi-Version Concurrency Control),即多版本并发控制,是一种数据库的并发控制机制。
MVCC是一种用来解决读写冲突的无锁并发控制,到底解决了什么问题呢?
在并发读写时,可以在读操作时不阻塞写操作,写操作时也不阻塞读操作,提高了数据库并发读写的性能。
解决脏读、幻读、不可重复读等事务隔离问题。
MVCC原理:
主要依赖于记录中的三个隐藏字段、undolog,read view来实现。
-
隐藏字段
每行记录都隐含DB_TRX_ID,DB_ROLL_PTR,DB_ROW_ID三个字段。
DB_TRX_ID:记录创建这条记录或者最后一次修改该记录的事务id
DB_ROLL_PTR:回滚指针,指向上一个旧版本
DB_ROW_ID:隐藏的主键
-
undolog
回滚日志,在进行insert,delete,update操作的时候产生的方便回滚的日志。
-
Read View
事务进行快照读操作时生成的读视图,在该事务执行快照读的那一刻,系统会生成一个快照,记录此时事务的id,用来做可见性判断的,判断当前事务能够看到哪个版本的数据,有可能读取到的是最新的数据,也有可能读取到的是当前记录的undolog中某个版本的数据。
总结:
-
在MVCC中,每个数据行都会维护多个版本。每当对一行数据进行更新操作时,都会生成新的版本。每个版本都有一个时间戳,用于标识该版本的创建时间。
-
在读取数据时,事务只能看到创建时间早于事务开始时间的版本。
-
当写操作时,会生成新的版本并更新到数据行中。旧的版本仍然存在,不会被删除。以便正在进行的其他事务可以继续读取到旧的版本,不会被阻塞。
-
MVCC版本控制机制维护了数据的一致性和隔离性。事务开始时,会记录当前的最新版本号。在事务执行过程中,只能读取到小于事务开始时的版本,保证读取的数据在事务开始时是一致的。
系列文章索引
MyBatis的插件能在哪些地方进行拦截?
了解MyBatis的缓存机制吗
面试官:谈谈对volatile的理解
Spring中用到了哪些设计模式
面试官:说一下SQL的执行过程
线程池的工作原理