zoukankan      html  css  js  c++  java
  • mysql是如何实现mvcc的

    mvcc的概念

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

    可解决的问题

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

    前置概念

    当前读

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

    快照读

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

    mvcc实现的三大要素

    图示:

    image

    隐式字段

    数据库的每行记录除了记录显示的数据外,还会有一些隐藏字段,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前就已提交,则对当前事务可见,具体见图:
    

    image

    希望每get一个知识点都能坚持用博客记录下来,加油!
  • 相关阅读:
    Android应用增量更新
    corner2
    UIProject
    Argo
    flower-recognition
    Android-Chat-Widget
    leanchat-android
    Beautyacticle
    XianBicycle
    完整性约束(章节摘要)
  • 原文地址:https://www.cnblogs.com/darling2047/p/15132154.html
Copyright © 2011-2022 走看看