Mysql多版本并发控制(MVCC)

Mysql多版本并发控制(MVCC)Mysql和其他大多数数据库中的事务型存储引擎的实现一般都不是简单的行锁。一般基于提升并发性能考虑,他们一般都会实现多版本并发控制(MVCC),他们实现的机制都不太一样。这里可以将MVCC看做成是一个行锁+读锁的一种合理的组合方式。(但本身是没有进行加锁的操作的)MVCC的实现是通过保存某个时间点的快照(ReadView)来实现的。————————————————————————————————————————————————————————ReadView解析m_ids表示当前还没提交的事务id的列表min_trx_id表示列表中最小的事务idmax_trx_id表示列表中最大的事务id+1(即:即将分配的事务id)creator_trx_id表示当前事务的事务idReadView判断版本链中可用的判断依据trx_id == creator_trx_id ——》 可以访问的版本(代表自己建立的事务版本)trx_id<min_trx_id——》 可以访问这个版本(代表已经提交过的事务版本)trx_id > max_trx_id ——》 不可以访问这个版本min_trx_id <=trx_id <= max_trx_id——》如果在m_ids(没有提交的事务id)中则不可以访问,如果没在则事务的线程已经超车完成提交了事务,则可以访问注:trx_id是访问的事务版本id,当是select查询语句的时候id并不是为零,会有自己的一套生成规则。(听大佬的参考:《mysql是怎样运行的》,自己不摸鱼以后过来重新补充改改)————————————————————————————————————————————————————————拿InnoDB引擎的MVCC来说,它是通过在每行数据的后面加上隐藏的三列来实现的,即row_id:确认当前行唯一用的,有主键或者唯一索引的时候不生成。transaction_id:事务id,就是当前行的事务版本号。roll_pointer:回滚指针,指向undolog记录的当前数据的上一个版本的指针。(undolog会记录很多个版本,一个版本的指针指向上个版本,会形成一个链,就叫版本链)每当有一个新的事务开启的时候,就会有一个与其对应的事务版本号,系统版本号都会递增。这里面我们拿repeatable read(可重复读)隔离级别下的MVCC操作来举个例子:Insert操作:为新插入的每一行保存当前系统版本号作为当前行的版本号。Delete操作:为删除的每一行保存当前系统版本号为当前行的版本号。Update操作:为插入一行的新纪录保存当前版本号作为当前行的版本号。Select操作:也会生成一个对应的事务id,然后进行当前事务id的进行判断。然后就会根据版本链中的对应的版本号进行数据读取。MVCC只在可重复读和读已提交两个隔离级别下生效,其余隔离级别下是不需要的。

(0)

相关推荐

  • 什么是 MVCC

    来源:Python 技术「ID: pythonall」 上一篇文章我们说到数据库的四种事务隔离级别,可以通过加锁的方式来实现,只是效率太低,事实上,MySQL 是通过 MVCC(多版本并发控制)来实现 ...

  • MySQL(一):MySQL数据库事务与锁

    基本概念 事务是指满足ACID特性的的一组操作,可以通过Commit提交事务,也可以也可以通过Rollback进行回滚.会存在中间态和一致性状态(也是真正在数据库表中存在的状态) ACID Atomi ...

  • 还原面试现场-ACID与隔离级别

    前言 现如今JAVA开发工程师的数量越来越多,但大多数工程师平时做的工作都是简单的CRUD,当你一直处于这种舒适的环境中不追求进步的时候,如果哪一天你突然想要改变环境,换个工作,去与面试官当面聊技术的 ...

  • 跟面试官侃半小时MySQL事务隔离性,从基本概念深入到实现

    来源 | 阿丸笔记 提到MySQL的事务,我相信对MySQL有了解的同学都能聊上几句,无论是面试求职,还是日常开发,MySQL的事务都跟我们息息相关. 而事务的ACID(即原子性Atomicity.一 ...

  • 看一遍就理解:MVCC原理详解

    前言 MVCC实现原理是一道非常高频的面试题,技术讨论群的小伙伴一直在讨论,趁着之前的国庆节长假,好好总结了一番,希望对你有所帮助. 1. 相关数据库知识点回顾 1.1 什么是数据库事务,为什么要有事 ...

  • 在 MySQL 中是如何通过 MVCC 机制来解决不可重复读和幻读问题的?

    「不可重复读现象指的是,在一个事务内,连续两次查询同一条数据,查到的结果前后不一样」. 在 MySQL 的可重复读隔离级别下,不存在不可重复读的问题,那么 MySQL 是如何解决的呢? 答案就是 MV ...

  • MySQL中的乐观锁,悲观锁和MVCC全面解析

    这篇文章主要介绍了MySQL中的乐观锁和悲观锁和MVCC全面解析的相关资料,帮助大家更好的理解和学习MySQL数据库,感兴趣的朋友可以了解下前言在数据库的实际使用过程中,我们常常会遇到不希望数据被同时 ...

  • 记一次MySQL中Waiting for table metadata lock的解决方法

    最近项目中的数据库查询经常挂起,应用程序启动后也报操作超时.测试人员就说数据库又挂了(貌似他们眼中的连接失败,查询无果都是挂了),通过 show processlist 一看,满屏都是 Waiting ...

  • 【MySQL笔记】正确的理解MySQL的乐观锁,悲观锁与MVCC

    正确的理解MySQL的乐观锁,悲观锁与MVCC 如果觉得对你有帮助,能否点个赞或关个注,以示鼓励笔者呢?!博客目录 | 先点这里 !首先声明,MySQL的测试环境是5.7 前提概念 数据库并发的三种场 ...

  • mysql中的事务隔离级别及可重复读读提交详细分析(mvcc多版本控制/undo log)

    一.事物隔离级别 读未提交(read uncommitted)是指,一个事务还没提交时,它做的变更就能被别的事务看到.通俗理解,别人改数据的事务尚未提交,我在我的事务中也能读到. 读提交(read c ...