ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

MVCC-多版本并发控制

2022-03-30 20:35:07  阅读:209  来源: 互联网

标签:事务 rows 快照 版本 版本号 并发 当前 MVCC 读取


  • 理解快照读和当前读
  1. 快照读:一致性不加锁的读,在可重复读的隔离级别下,每次事务启动之前都会对当前库拍一个快照,当前事务读取的数据要么是事务开启时快照的数据,要么是事务本身插入或更新的数据;
  2. 当前读:当前最新的数据,开启后能在事务中读取到其他已提交事务的最新数据;如for update, lock in share model;

for update 与 lock in share model 两者区别:

for update用于给符合条件的rows加上IX(意向排它锁),加锁后,其他事物不能读取或修改当前被锁定的rows,但innodb存在一致性非锁定的读,所以能读取对应的快照读,所以不会阻塞其他事务对锁定rows的快照度;

lock in share model用于给符合条件的rows加上IS(意向共享锁)。加锁后,其他事物能读取对应的rows,也能给对应的rows加IS锁,但是无法修改当前锁定的rows,直到锁定的session已经提交;

 

  • InnoDB中MVCC:

InnoDB中MVCC是通过两个隐藏列来实现的,用于保存行的创建时间和过期时间(删除时间);这里所谓的时间不是实际的时间值,而是系统版本号(system version number)。当session开启时,系统版本号都会自动递增,作为当前session的版本号,用来和查询到到每行记录到版本做比较。

在可重复度隔离级别下,MVCC操作如下:

  1. SELECT:只查找版本早于或等于当前事务版本的数据行,行的删除版本要么未定义,要么大于当前事务版本号;
  2. INSERT:将当前系统版本号作为插入的每一行的版本号;
  3. UPDATE:保存当前版本号为行版本号,同时保存当前版本号到原来的行作为删除标识;
  4. DELETE:为删除的每一行保存当前系统版本号作为行删除标识;

MCVV只在读已提交和可重复度隔离级别下工作,因为读未提交下总是读取到最新到数据,不满足当前事务版本的数据行,而串行化会给每一读取到的行加锁。

 

标签:事务,rows,快照,版本,版本号,并发,当前,MVCC,读取
来源: https://www.cnblogs.com/sunql/p/16078912.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有