mysql的MVCC机制

面试问题:如果两个客户端同时执行一个查询sql,为什么查出的数据可能不一样?

解答:是因为mysql底层维护了一个undo日志版本链和read-view一致性试图机制,在repeatable-read隔离级别下,一个事务开启之后,当执行查询语句的时候,就生成了一个read-view,之后查询就会根据一定的规则去undo日志版本链中比对数据;在read-commited隔离级别下,一个事务开启之后,每次执行查询语句的时候,都生成新的read-view,查询就会根据和repeatable-read隔离级别下一样的规则去undo日志版本链中比对数据。

对比规则如下:

如果版本链中的trx_id<min_id,说明当前事务可见;

如果版本链中的trx_id>max_id,说明当前事务不可见;

如果版本链中的min_id<=trx_id<=max_id,存在两种判断。

        若版本链中的trx_id位于数组中,则说明这个版本是由未提交的事务生成,不可见。

        若版本链中的trx_id不在数组中,说明这个版本是由已提交的事务生成,可见。


如下例:


分析:


©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • MVCC并发控制中,读操作可以分成两类:快照读 (snapshot read)与当前读 (current read...
    尹楷楷阅读 1,110评论 0 5
  • 我们都知道事务的4个特性,原子性 一致性 隔离性和持久化事务具有4个特征,分别是原子性、一致性、隔离性和持久性,简...
    念䋛阅读 1,252评论 0 0
  • 1 Mysql中的一些日志文件跟事务隔离性的介绍 1.1 redo log redo log就是保存执行的SQL语...
    小狐憨憨阅读 856评论 0 0
  • 1.文章适用对象: 能够基本描述清楚mysql事务隔离级别 不可重复去或可重复读的现象,想进一步探讨底层设计思想的...
    华北_b5ef阅读 1,412评论 0 1
  • MySql事务实现的机制:MVCC 这一篇将简单说明一下最近学习了Mysql的事务实现的简单理解。 如果存在一张A...
    zekers阅读 630评论 0 0