文章目录
前言
提示:此处涉及到的点比较多,若是有什么疑问点欢迎下方交流
我最开始仅仅是在spring层面进行使用Mysql的事务,但是后来不知道什么时候忽然被面试官问到这个问题了,没办法问到了就整理一下吧。
整理了三天,总算是出来了,但是还没有到自己想要的那么精简
so,有好的意见记得找我哦
一、MVCC?官方一些解释
MVCC全称为Multi-Version Concurrency Control即多版本并发控制。
它是一种用于数据库管理系统中的并发控制的技术,
在许多数据库系统(如MySQL的InnoDB存储引擎、PostgreSQL等)中得到使用。
MVCC通过为数据库对象(如行记录)提供多个版本来实现在没有锁定资源的情况下进行并发访问,增强了读写(这两个是一个整体)操作的并发性能。
但是在我看来就是一个思想,我们实际上用到的就是一个读数据的级别(当前读还是快照读)和同时操作多张表的原子性要么都操作成功,要么都操作失败
二、介绍MVCC
1.并发控制的必要性
1、并发控制是数据库管理系统同步多个事务的行为
2、避免由于事务之间的相互影响引起的一系列问题。
如果不妥善处理,并发操作可能会导致数据不一致,
例如脏读(读取未提交的数据)。
不可重复读(一个事务内两次及以上读取不一致)。
幻读(同一个事务两次及以上读取时出现新的行)。
补充:其实我也搞不懂为什么要查询两次或者多次在一个事务中?
但是:MVCC主要是解决读-写和写-读场景下的并发问题,而不是写-写场景,写-写通常还需要依赖锁机制。
2. MVCC的定义及目的
MVCC是一种用来控制数据库并发访问的技术,允许不同的事务看到某个时间点的数据快照。MVCC的主要优势是它可以在不加锁的情况下使读取操作并行进行,从而大大提高了事务的处理速度,同时维护了数据的一致性。
这里的一致是在某些场景下(如RR)的同一个事务内的一致。
MVCC的优势在于:
- 减少了锁的需求:读取操作通常不需要锁定资源,这样减少了锁竞争,提高了并发度。
- 读写分离:读写操作能够相互独立进行,因此在很多情况下,对数据的写入(更新、删除)不影响到数据的读取。
- 避免了读写冲突:读者不会阻塞写者,写者也不会阻塞读者。(因为读取的就不是一个地方)
补充:在MySQL的InnoDB存储引擎中每行记录都有隐藏的系统列如下:
DB_TRX_ID(最近修改事务的ID)
DB_ROLL_PTR(撤回指针,指向undo log的记录)
DB_ROW_ID(当未定义聚集索引时的隐藏的行ID)
以支持MVCC的实现。当你在执行SELECT、UPDATE、DELETE等操作时,InnoDB会通过MVCC机制确保每个事务都能正确地看到它应该看到的数据版本。
3、MVCC的核心机制和组件
Undo Log版本链:
当数据被修改时,其原版本并不会立即被覆盖,而是被记录在Undo Log中并生成版本链(类似于双向裂变)。如果需要,可以通过Undo Log找回之前的数据版本。这个机制使得数据库能够支持事务的回滚以及提供旧数据版本给不同的事务访问。
ReadView:
在事务开始时,系统会生成一个ReadView,其中记录了活跃的事务及其ID。ReadView确保了在事务执行期间,即使外部数据发生变化,事务也能继续看到一致的数据视图。还有最新的事务id以及最小事务id