mvcc的概念

mvcc即多版本并发控制,是一种并发控制的策略,能让数据库在高并发下做到安全高效的读写,提升数据库的并发性能;
是一种用来解决并发下读写冲突的无锁解决方案,为事务分配单向增长时间戳,为每次修改保存一个版本,版本号与时间戳关联;

可解决的问题

1、在并发读写数据库时,可以做到在读操作时不用阻塞写操作,写操作也不用阻塞读操作,提高了数据库并发读写的性能
2、解决脏读、幻读、不可重复读等事务隔离问题,但是不能解决更新丢失问题

前置概念

当前读

读取数据的最新版本,读取时需保证其他并发事务不能修改当前记录,会对读取的记录加锁;如insert,update,delete,for update等语句会走当前读

快照读

读的可能并不是最新数据,可能是历史数据;要求事务隔离级别不能是串行,串行级别下快照读会转为当前读;

mvcc实现的三大要素

图示:

隐式字段

数据库的每行记录除了记录显示的数据外,还会有一些隐藏字段,mvcc用到了其中三个,如下:
1.DBTRXID 最后修改该条记录的事务id,
2.DBROLLPTR 回滚指针,用于定位undolog中的历史记录,指向该记录的上一版本
3.DBROWJD 隐藏的主键

undoLog

即回滚日志,用于记录每条记录历史版本数据的日志文件,当update,insert,delete等语句执行时记录历史版本数据,方便出错时回滚

readview

定义

readview是事务进行快照读操作的时候生产的读视图,在该事务执行快照读的那一刻,会生成一个数据系统当前的快照,记录并维护系统当前活跃事务的id,事务的id值是递增的;可用来作可见性判断,当事务对某一记录执行快照读的时候会产生一个readview视图,可把它当做一个条件去判断当前事务能读到该数据的哪个版本,有可能读的是当前最新数据,也有可能读的是undolog中的历史数据

可见性判断规则

可见性判断的前提需要理解三个字段的概念:
trx_list:维护Read View生成时刻系统正活跃的事务ID
up_limit_id:记录trx_list列表中事务ID最小的ID
low_limit_id:Read View生成时刻系统尚未分配的下一个事务ID
比较可见性:
将记录的隐式字段DBTRXID拿出来与up_limit_id比较,如果小于表示DBTRXID在up_limit_id之前就生成了,属于历史数据,则对当前事务可见;
如果大于则继续判断DBTRXID>=low_limit_id,如果大于等于则表示DBTRXID是生成readview过后才产生的,则该记录不可见;
如果DBTRXID<low_limit_id则需判断DBTRXID在不在当前活跃的事务列表trx_list中,如果在列表中则不可见,否则表示该事务再生成readView前就已提交,则对当前事务可见,具体见图:

最新文章

  1. php 一些经常用到的方法
  2. 【bzoj1503】 NOI2004—郁闷的出纳员
  3. Centos系统下Lamp环境的快速搭建(超详细,转)
  4. 手把手教你开发chrome扩展一:开发Chrome Extenstion其实很简单
  5. 安装mysql(zip格式安装包)
  6. android获取手机的所有通讯录的号码和sim卡号码
  7. shell写的计算器
  8. 【读书笔记】管道和FIFO
  9. MySQL实用基础笔记
  10. angulajs 当input使用 bootstrap的email类型时,如果是无效的email格式,则ng-model无效的情况
  11. 解决编译时出现的警告:format string is not a string literal (potentially insecure)
  12. JavaScript(第一天)【&lt;script&gt;标签浅析】
  13. Python学习笔记1环境搭建
  14. devexpress vs2015 安装亲测
  15. cmd/git设置alias提高效率
  16. javaweb笔记三
  17. luogu4595 [COCI2011-2012#5] POPLOCAVANJE 后缀自动机
  18. VS code配置docker的shell环境
  19. 『C++』Temp_2018_12_13_Type
  20. linux ccenteros 部署 redis

热门文章

  1. ThreadLocal for Golang
  2. 洛谷P4135 作诗(不一样的分块)
  3. ARC125E - Snack (网络流)
  4. 【java】学习路径25-ArrayList类,Vector类,LinkedList类的使用和区别,Iterator迭代器的使用
  5. KingbaseES时间函数的比较
  6. KingbaseES R6 集群备库网卡down测试案例
  7. 小结event.target与this
  8. Python数据科学手册-机器学习: 主成分分析
  9. 云原生之旅 - 3)Terraform - Create and Maintain Infrastructure as Code
  10. 我眼中的大数据(二)——HDFS