-----本文章为个人理解,如有疑问或错误欢迎留言并讨论-----

谢谢。

昨天去去哪儿网面试,老周和老赵问了很多问题,大多关于细节,其中就包括事务隔离级别和MVCC,由于准备不够充分,所以今天特地进行验证。

其中隔离级别中,比较让人难以理解的是repeatable read可重复读,和serializable串行读,下面依次进行试验,查看彼此区别。

serializable隔离级别:session 1session 2

mysql> show variables like '%iso%';

+---------------+--------------+

| Variable_name | Value        |

+---------------+--------------+

| tx_isolation  | SERIALIZABLE |

+---------------+--------------+

1 row in set (0.00 sec)

mysql> begin;

Query OK, 0 rows affected (0.00 sec)

mysql> select * from t;

+---+

| i |

+---+

| 1 |

| 2 |

| 3 |

| 4 |

| 5 |

+---+

5 rows in set (0.00 sec)mysql> show variables like '%iso%';

+---------------+--------------+

| Variable_name | Value        |

+---------------+--------------+

| tx_isolation  | SERIALIZABLE |

+---------------+--------------+

1 row in set (0.00 sec)

mysql> begin;

Query OK, 0 rows affected (0.00 sec)

mysql> select * from t;

+---+

| i |

+---+

| 1 |

| 2 |

| 3 |

| 4 |

| 5 |

+---+

5 rows in set (0.00 sec)

mysql> insert into t values (6);

ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

mysql> insert into t values (10);

ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

上面现象说明:当隔离级别为serializable的时候,不兼容MVCC,严格遵循锁机制,当session1 和session2都进行全表查询时,两个会话都会全表加读锁,由于读锁只和读锁相兼容,所以此时任何一个会话都无法修改、插入数据,会进入所等待。

repeatable read隔离级别:

session 1session 2

mysql> show variables like '%iso%';

+---------------+-----------------+

| Variable_name | Value           |

+---------------+-----------------+

| tx_isolation  | REPEATABLE-READ |

+---------------+-----------------+

1 row in set (0.00 sec)

mysql> begin;

Query OK, 0 rows affected (0.00 sec)

mysql> select * from t;

+---+

| i |

+---+

| 1 |

| 2 |

| 3 |

| 4 |

| 5 |

+---+

5 rows in set (0.00 sec)mysql> show variables like '%iso%';

+---------------+-----------------+

| Variable_name | Value           |

+---------------+-----------------+

| tx_isolation  | REPEATABLE-READ |

+---------------+-----------------+

1 row in set (0.00 sec)

mysql> begin;

Query OK, 0 rows affected (0.00 sec)

mysql> select * from t;

+---+

| i |

+---+

| 1 |

| 2 |

| 3 |

| 4 |

| 5 |

+---+

5 rows in set (0.00 sec)

mysql> insert into t values (6);

Query OK, 1 row affected (0.00 sec)

mysql> select * from t;

+---+

| i |

+---+

| 1 |

| 2 |

| 3 |

| 4 |

| 5 |

| 6 |

+---+

6 rows in set (0.00 sec)mysql> select * from t;

+---+

| i |

+---+

| 1 |

| 2 |

| 3 |

| 4 |

| 5 |

+---+

5 rows in set (0.00 sec)

mysql> insert into t values (6);

ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

上面现象说明:当隔离级别为repeatable read时,兼容使用MVCC(使用undo),此时两个事物读取数据到各自的undo中,事物之间独立,但是不同事务对于同一行数据的修改会根据顺序加上排他锁。其中上面session 2最后插入一条数据,是因为session 1已经存在并将该行数据锁定,同时此刻出现在repeatable read隔离级别所特有的幻读现象(本会话内并没有该数据,却依然无法插入)。

总结:

MVCC:多版本控制,多个未提交事务所看到的数据都是自己的,彼此不同,在客户端总体看来仿佛多个版本个数据库。

MVCC只和隔离级别read-committed和repeatable-read相兼容,MACC对于不同事物的同一行的读写之间是不加锁的,对于不同事务的同一行的写写加锁。

MVCC和read-uncommitted和serializable不兼容,其中serializable完是由锁来控制,所有事务均符合锁特征。

在事务隔离级别设定为repeatable read的情况下,一般的select语句采取的是一致性非阻塞读的方式。一致性是指在事务的范围内读取的数据是可重现的,不会出现不可重复读的情况。非阻塞是指这种读取数据的模式不会对数据上任何一种锁,其它操作全都不会被阻塞。在这种模式下,事务执行读取语句后,相关的数据会有一套副本出现,并会为这个数据副本附加一个时间戳,其它事务在这个时间戳之后执行的写操作都不会反映到这个副本中,这种机制被称之为多版本并发控制。如果用select …… lock in share mode,则不是一致性非阻塞读,该语句会等待其它事务的写语句提交或回滚之后再读取数据;如果事务隔离级别设置为read committed,也不是一致性非阻塞读,该语句会读取其它事务提交的数据。

mysql mvcc 隔离级别_隔离级别和MVCC相关推荐

  1. mysql 查看运行级别_运行级别及进程

    /etc/rc.d/rc.sysinit 由init进程调用执行 完成设置网络.主机名.加载文件系统等初始化工作 /etc/rc.d/rc脚本文件 由init进程调用执行 根据指定的运行级别, 加载或 ...

  2. java查看对象锁级别_对象级别锁 vs 类级别锁(Java)

    前言 对于多线程(并发)和Spring Boot这两块在同步进行学习中,在看到使用synchronized关键字使操作同步时,看到和C#中不一样的东西,所以这里呢,就深入学习了下,若有错误之处,还望指 ...

  3. 事物的级别_浅谈MySQL并发控制:隔离级别、锁与MVCC

    推荐阅读: 恕我直言!收藏这个MySQL文档,你其余的MySQL学习资料都可以扔了 前言 如果数据库中的事务都是串行执行的,这种方式可以保障事务的执行不会出现异常和错误,但带来的问题是串行执行会带来性 ...

  4. mysql mvcc 隔离级别_关于 Mysql 四种隔离级别中 Lock 和 MVCC 的关系

    读写锁 共享锁(share lock)| 读锁(read lock) 读锁是共享的,或者说是相互不阻塞的.多个客户在同一时刻可以同时读取同一个资源,而互不干扰 SELECT ... LOCK IN S ...

  5. mysql 默认事务隔离级别_一文读懂MySQL的事务隔离级别及MVCC机制

    回顾前文: <一文学会MySQL的explain工具> <一文读懂MySQL的索引结构及查询优化> (同时再次强调,这几篇关于MySQL的探究都是基于5.7版本,相关总结与结论 ...

  6. mysql重复读导致余额不对_我所理解的MySQL之四:事务、隔离级别及MVCC

    mysql教程栏目介绍MySQL相关的事务.隔离级别及MVCC. MySQL 系列的第四篇,主要内容是事务,包括事务 ACID 特性,隔离级别,脏读.不可重复读.幻读的理解以及多版本并发控制(MVCC ...

  7. 事物的级别_面试官问:MySQL锁与事物隔离级别你知道吗?

    本文作者:何建辉(公众号:org_yijiaoqian) 点赞再看,养成习惯,微信搜一搜[一角钱小助手]关注更多原创技术文章. 本文 GitHub org_hejianhui/JavaStudy 已收 ...

  8. mysql innodb隔离级别_浅析MySQL InnoDB的隔离级别

    本文就将对上面这两个问题进行解答,分析事务的隔离级别以及相关锁机制. 隔离性简介 隔离性主要是指数据库系统提供一定的隔离机制,保证事务在不受外部并发操作影响的"独立"环境执行,意思 ...

  9. mysql mvcc和行锁_mysql在RR的隔离级别下,究竟是通过MVCC解决幻读的还是通过行锁的next key算法解决的?...

    首先,我们需要搞懂几个隔离级别的意思和每个隔离级别会出现的问题.隔离级别分为:读未提交,读提交,可重复读和可串行化. 读未提交是最低级别的隔离级别,表示当一个事务还没有提交时,他所做的变更就被别的事务 ...

最新文章

  1. python封装一个效率极高的 批量更新、插入合一的工具
  2. ViewPager实现页面切换
  3. CodeForces 615C
  4. 蚁群算法python_想要学习启发式算法?推荐你看看这个价值极高的开源项目
  5. 串口接收到的浮点数(解码后出现的错误)
  6. 杭电2151 Worm dp
  7. python的简单GUI(多线程时钟)
  8. 赛尔原创 | ACL20 用于多领域端到端任务型对话系统的动态融合网络
  9. Opencv2.4.9源码分析——Stitching(七)
  10. 【阿朱归类】2015 新兴互联网公司 TOP 300
  11. ios android 跨平台工具,15个很优秀的跨平台的移动开发工具
  12. 企鹅号一万阅读能有多少收益?企鹅号平台补贴怎么获得
  13. ps基础学习:更改证件照的背景色
  14. 在外行人眼中的程序员
  15. http://www.dewen.net.cn/q/9980/JQuery AJAX GBK 编
  16. ABP VNext学习日记20
  17. PowH3D 智能合约
  18. 搭建 Apache Http Server 服务器
  19. 只需一行Python代码即可玩20几款小游戏
  20. android调用系统指纹设置页面录入指纹

热门文章

  1. 刚转Java?那准备转回.NET5吧!
  2. 2020.NET开发者大会大会线上同步直播,以及参会秘籍
  3. TestinPro应用与DevOps之路
  4. 「数据ETL」从数据民工到数据白领蜕变之旅(三)-除了Excel催化剂之外PowerQuery新物种同样值得期待...
  5. 高性能微服务网关.NETCore客户端Kong.Net开源发布
  6. .NET Core IdentityServer4实战 第Ⅴ章-单点登录
  7. .NET Core 给使用.NET的公司所带来的机遇
  8. dotnetClub 的前世今生
  9. 分布式事务一致性解决方案
  10. .NET Core 已经实现了PHP JIT,现在PHP是.NET上的一门开发语言