MySql并发:MVCC+锁

以下基于INNODB引擎,RR隔离级别

MVCC

多版本的并发控制协议

  1. 隐藏列:InnoDB中每行数据都有隐藏列,隐藏列包含了:本行数据的事务id、指向undo log的指针等。
  2. 基于undo log的版本链:每行数据的隐藏列中包含了指向undo log的指针,而每条undo log也会指向更早版本的undo log,形成版本链。
  3. ReadView:通过隐藏列和版本链,Mysql可以将数据恢复到指定版本。具体恢复到哪个由ReadView决定。

所谓ReadView是指事务(A)在某一时刻给整个事务打快照,之后再进行读操作时,会读到事务id和快照比较,从而判断数据对事务A是否可见。


当前读和快照读

  • 当前读

像select lock in share mode(共享锁),for update(排他锁)这些操作都是一种当前读。

读取到得是最新版本,还要保证其他并发事务不能修改当前记录,会对记录加锁。

  • 快照读

不加锁的select操作;前提是隔离级别不是串行级别,快照读基于MVCC

普通select语句

  • RU,不加锁直接读取最新版本,可能出现脏读、不可重复读、幻读
  • RC,不加锁每次执行select都会生成一个readView,避免脏读,会出现不可重复读和幻读
  • RR,不加锁,只有第一次执行select生成一个readView,避免了脏读、不可重复读和幻读
  • 序列化
    • 系统变量autocommit=0时,普通select被转换为select...lock in share mode。也就是S锁;
    • 系统变脸autocommit=1时,普通select不会加锁,只是利用mvcc生成一个readView,因为启动自动提交意味着一个事务只包含一条语句,只执行一条语句不会出现不可重复读和幻读的现象

 

当一个事务(creator_trx_id)对数据进行快照读时:

1、生成当前readview

2、拿到数据的最新事务id:trx_id

3、trx_id = creator_trx_id(当前事务id),说明这条数据是当前事务更新的,可以获取

4、trx_id < min_trx_id,数据在当前所有正在运行事务前更新,可以获取

5、trx_id >= max_trx_id,数据被生成readview之后的事务更改,不能访问

6、生成readview时正在运行的事务列表包含trx_id,数据是被当前列表的事务更新,通过undolog找到记录的上一个事务id,回到步骤2

7、trx_list不包含trx_id,可以访问(假设当前事务id = 10,比如id = 14 和 id = 15事务,在生成readview前id = 14 事务提交,导致一系列条件不符合,也不在trx_id中,建立readview后读取的是最新id = 14的记录)

8、结束

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
多版本并发控制(MVCC)是MySQL中的一种技术,它通过维护数据的多个版本,以实现读写操作的并发控制。MVCC通过在每行记录后面保存两个隐藏的列(一个保存行的创建时间,一个保存行的删除时间)来实现。当一个事务读取数据时,它会根据事务开始的时间戳和行的版本信息来确定可见的数据版本。这种机制在InnoDB存储引擎中被广泛使用,可以提供一致性读操作的保证。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [MySQL之InnoDB存储引擎-MVCC](https://blog.csdn.net/qq_53267860/article/details/125073612)[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^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [MySQL数据库多版本并发控制MVCC](https://blog.csdn.net/iuu77/article/details/129132863)[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^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [mysql多版本并发控制MVCC的实现](https://download.csdn.net/download/weixin_38607195/14907745)[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^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值