Mysql MVCC总结

MVCC是不加锁实现多个事务对数据库的并发访问

浅显原理:

在每一行除了本来的数据外附加了两列,一列是创建行时的版本号ID一列是删除时的版本号ID

idnamecreate-versiondelete-version
1tom
  1. 如果现在事务ID为1的事务插入了一行数据就会有
idnamecreate-versiondelete-version
1tom
将createversion修改为当前的事务id
  1. 如果现在事务ID为2的事务改了id = 1的name
idnamecreate-versiondelete-version
1tom12
1mike2
会把之前的删除版本号填上自己的,并且代替原来的创建版本号

查询过滤条件:

  1. 只有创建版本号小于或等于当前事务id,即事务id为2的事务只能读取到create version<=2的已提交的事务的数据集

  2. 删除版本号未指定,或者删除版本号大于当前事务id,就是说当前事务时,确保这个数据没有被删除。

底层原理(复杂原理)

首先在每个事务对数据库某一行进行修改的时候,在这一行上还会有附加的事务id(DB_TRX_ID)和回滚指针(DB_ROLL_PTR)
在这里插入图片描述
(先不用管隐式主键不重要)
当我们事务对数据库进行修改的时候,新的回滚指针指向上一次的版本,把老的放到undo日志里面,这样就会形成一条版本引用链

如下图
在这里插入图片描述

我们从上到下按时间顺序搞三个事务:
时间图
看select1的第一个select,因为事务100和事务200未对account表操作,很显然id = 1就是lilei300
再看第二次select,这时候就得用生成的readview结合一定的过滤条件去版本链里面找哪个版本的lilei合适
先说readview,MVCC只适用于可重复读和读已提交,可重复读是一直沿用第一次select生成的readview,读已提交是每一次查找都生成新的readview。那么readview是什么呢

readview

它由未提交的事务id数组(里面最小的事务id叫min_id)和已知的最大事务id(max_id)组成,每次都是拿这个readview按照一定的规则在版本链中去找哪一行数据合适,可见:
会根据min_id,max_id将整个事务版本号集合划分为:
在这里插入图片描述
版本链比对规则:
1.如果落在绿色部分(trx id<min id),表示个版本是已提交的事务生成的,这个数据是可见的
2.如果落在红色部分(trx id > max_id),表示这个版本是由将来启动的事务生成的,是肯定不可见的

3.如果落在黄色部分 max id),那就包括两种情况

a.若row的 trx id在数组中,表示这个版本是由还没提交的事务生成的,不可见,当前自己的事务是可见的
b.若rowtrx的 id不在数组中,表示这个版本是已经提交了的事务生成的,可见。

再来看select 1中的第二条查询:
readview = [100,200]300;
在这里插入图片描述
在版本链中按照此规则找出lilei300

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQLMVCC(Multi-Version Concurrency Control)是一种并发控制的方法,用于实现对数据库的并发访问。它通过为每一数据添加版本号来实现并发控制,使得读操作不会被写操作所阻塞,从而提高数据库的并发性能。\[1\] MVCC在MySQL中主要适用于隔离级别中的读已提交(Read committed)和可重复读(Repeatable Read)。对于Read uncommitted隔离级别,由于存在脏读,即能读到未提交事务数据,所以不适用MVCC。而对于串化隔离级别,由于对所涉及到的表加锁,并非锁,所以也不存在的版本控制问题。\[2\] MVCC的主要作用是实现事务性的、有锁控制的数据库模型。它通过创建版本和删除版本来实现并发控制,使得读操作可以读取到之前提交的版本,而写操作则会创建新的版本。这样可以实现读操作的非阻塞,提高数据库的并发性能。\[3\] 总结来说,MySQLMVCC是一种通过版本控制实现并发控制的方法,适用于事务性的、有锁控制的数据库模型,可以提高数据库的并发性能。 #### 引用[.reference_title] - *1* *2* [Mysql中的MVCC](https://blog.csdn.net/weixin_42203131/article/details/130526351)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [MySqlMVCC详解](https://blog.csdn.net/hncujing/article/details/127391755)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值