文章插图
在这里插入图片描述
??其实MVCC 就是为了实现读-写冲突不加锁,而这个读指的就是快照读, 而非当前读,当前读实际上是一种加锁的操作,是悲观锁的实现.
3.三者关系
??当前读,快照度和MVCC的关系是如何的呢?
- MVCC 多版本并发控制是(维持一个数据的多个版本,使得读写操作没有冲突) 的概念,只是一个抽象概念,并非实现
- 因为 MVCC 只是一个抽象概念,要实现这么一个概念,MySQL 就需要提供具体的功能去实现它,(快照读就是 MySQL 实现 MVCC 理想模型的其中一个非阻塞读功能)。而相对而言,当前读就是悲观锁的具体功能实现
- 要说的再细致一些,快照读本身也是一个抽象概念,再深入研究。MVCC 模型在 MySQL 中的具体实现则是由 3 个隐式字段,undo 日志 ,Read View 等去完成的,具体可以看下面的 MVCC 实现原理
??首先我们要清楚数据库中的并发场景有三种,分别是:

文章插图
在这里插入图片描述
??然后来看MVCC的好处:
??多版本并发控制(MVCC)是一种用来解决读-写冲突的无锁并发控制,也就是为事务分配单向增长的时间戳,为每个修改保存一个版本,版本与事务时间戳关联,读操作只读该事务开始前的数据库的快照。所以 MVCC 可以为数据库解决以下问题:
- 在并发读写数据库时,可以做到在读操作时不用阻塞写操作,写操作也不用阻塞读操作,提高了数据库并发读写的性能
- 同时还可以解决脏读,幻读,不可重复读等事务隔离问题,但不能解决更新丢失问题
??MVCC 的目的就是多版本并发控制,在数据库中的实现,就是为了解决读写冲突,它的实现原理主要是依赖记录中的 3个隐式字段,undo日志 ,Read View 来实现的。
5.1 三个隐藏字段

文章插图
在这里插入图片描述??DB_ROW_ID 是数据库默认为该行记录生成的唯一隐式主键,DB_TRX_ID 是当前操作该记录的事务 ID ,而 DB_ROLL_PTR 是一个回滚指针,用于配合 undo日志,指向上一个旧版本
举例如:

文章插图
在这里插入图片描述

文章插图
在这里插入图片描述

文章插图
在这里插入图片描述
??从上面,我们就可以看出,不同事务或者相同事务的对同一记录的修改,会导致该记录的undo log成为一条记录版本线性表,既链表,undo log 的链首就是最新的旧记录,链尾就是最早的旧记录.
undolog:回滚日志,保存了事务发生之前的数据的一个版本,作用:
- 可以用于回滚
- 同时可以提供多版本并发控制下的读(MVCC),也即非锁定读。
- 事务开始之前,将当前事务版本生成 undo log,undo log 也会产生 redo log 来保证 undo log 的可靠性。
- 当事务提交之后,undo log 并不能立马被删除,而是放入待清理的链表。
- 由 purge 线程判断是否有其它事务在使用 undo 段中表的上一个事务之前的版本信息,从而决定是否可以清理 undo log 的日志空间。
推荐阅读
- 数据|非法获取计算机信息系统数据罪-浅析计算机数据库系统在信息管理
- 信息数据库|安恒信息数据库审计中标中国移动集采项目
- ible server|Azure Database for MySQL Flexible Server上线
- 日本广播协会电视台|数据库存10万份错误记录?!日本新冠疫苗接种证明软件上线…
- 非法获取计算机信息系统数据罪-论计算机数据库系统在信息管理(1)
- l亚马逊云科技是如何造Serverless数据库的?
- 数据库进阶系列之开窗函数|九道门 | 函数
- 图数据库厂商「创邻科技」完成36氪独家 | 高性能
- 数据库|计算机数据库系统在信息管理中的应用
- 数据库|历史上的五大数据泄露事件,你知道几个?