聊聊MySQL的隔离级别

原文:聊聊MySQL的隔离级别 | MySQL隔离级别原理
参考:oracle - mysql - 数据库事务隔离级别介绍
参考写的不全面, 按现在的理解,重新写一个;

一、名词解释

脏读:在一个查询事务过程中,读到了其它事务没有提交的数据;
不可重复读:一个事务查询过程中,多次查询得到了不一致的结果,原因是:有别的更新事务提交了;
幻读:一个事务查询过程中,多次查询得到了不一致的结果,原因是:有别的删除事务/插入事务提交了;

二、数据库隔离级别

隔离级别.png

ps:不能使用表格简直了,只有截图;

三、控制方式

读未提交:每次都是读数据最新的版本(包括事务未提交的数据);
读已提交:MVCC控制;
可重复读:MVCC控制;
序列化:在读取的每一行上加锁,只能按顺序进行读写;

四、InnoDB MVCC(多版本并发控制)原理


InnoDB引擎下的MVCC,是通过在每一行上增加两个隐藏列实现的;
每发生一个新的事务,系统版本都会递增;
当UPDATE数据的时候,都是先copy出来一行操作,不影响原表数据,提交之后才影响;

一个保存创建时间(非时间值,而是系统版本号);
一个保存删除时间(非时间值,而是系统版本号);

4.1 SELECT

当前查询事务系统ID:5
结果条件:

  1. CREATE VERSION <= 5(RR级别为 <= 5,RC级别应该是直接取最大值);
  2. DELETE VERSION == null or DELETE VERSION > 5 (RR级别应该只有为空,RC级别可能有 > 5的情况);

1可以保证读取到的行,在事务开始之前就已经存在,要么是事务自身插入或者修改的;
2可以保证读取到的行,在事务开始之前未被删除;

4.2 INSERT

为新插入的每一行保存当前系统版本号作为CREATE VERSION;

4.3 DELETE

为删除的每一行保存当前系统版本号作为DELETE VERSION;

4.4 UPDATE

插入一行新的记录,保存当前系统版本号作为CREATE VERSION;
同事保存当前系统版本号到原来的行上作为DELETE VERSION;

五、参考:

  1. 《高性能MySQL》
  2. <a href="https://www.cnblogs.com/huanongying/p/7021555.html" target="_blank">MySQL的四种事务隔离级别</a>(ps:此处有测试截图,比较直观)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容