MVCC


MySQL INNODB存储引擎,实现的是基于多版本的并发控制协议——MVCC (Multi-VERSION Concurrency Control)。MVCC最大的好处,相信也是耳熟能详:读不加锁,读写不冲突。在读多写少的OLTP应用中,读写不冲突是非常重要的,极大的增加了系统的并发性能,这也是为什么现阶段,几乎所有的RDBMS,都支持了MVCC。

在MVCC并发控制中,读操作可以分成两类:快照读 (snapshot read)与当前读 (current read)。快照读,读取的是记录的可见版本 (有可能是历史版本),不用加锁。当前读,读取的是记录的最新版本,并且当前读返回的记录,都会加上锁,保证其他事务不会再并发修改这条记录。

在一个支持MVCC并发控制的系统中,哪些读操作是快照读?哪些操作又是当前读呢?以MySQL InnoDB为例:

快照读:简单的SELECT操作,属于快照读,不加锁。(当然也有例外,下面会分析)

  • select * from table where ?;

当前读:特殊的读操作,插入/更新/删除操作,属于当前读,需要加锁。

  • select * from table where ? lock in share mode;

  • select * from table where ? for update;

  • insert into table values (…);

  • update table set ? where ?;

  • delete from table where ?;

为什么将 插入/更新/删除 操作,都归为当前读?可以看看下面这个 更新 操作,在数据库中的执行流程:

从上图可以看出,当UPDATE SQL被发给MySQL后,MySQL SERVER会根据WHERE条件,读取第一条满足条件的记录,然后INNODB引擎会将第一条记录返回,并加锁 (current READ)。待MySQL SERVER收到这条加锁的记录之后,会再发起一个UPDATE请求,更新这条记录。一条记录操作完成,再读取下一条记录,直至没有满足条件的记录为止。因此,UPDATE操作内部,就包含了一个当前读。同理,DELETE操作也一样。INSERT操作会稍微有些不同,简单来说,就是INSERT操作可能会触发UNIQUE KEY的冲突检查,也会进行一个当前读。

注:根据上图的交互,针对一条当前读的SQL语句,INNODB与MySQL SERVER的交互,是一条一条进行的,因此加锁也是一条一条进行的。先对一条满足条件的记录加锁,返回给MySQL SERVER,做一些DML操作;然后在读取下一条加锁,直至读取完毕

2PL


传统RDBMS加锁的一个原则,就是2PL (二阶段锁):Two-Phase Locking。相对而言,2PL比较容易理解,说的是锁操作分为两个阶段:加锁阶段与解锁阶段,并且保证加锁阶段与解锁阶段不相交。下面,仍旧以MySQL为例,来简单看看2PL在MySQL中的实现。

从上图可以看出,2PL就是将加锁/解锁分为两个完全不相交的阶段。加锁阶段:只加锁,不放锁。解锁阶段:只放锁,不加锁。

最新文章

  1. iOS二维码生成、识别、扫描等
  2. extjs5 常用属性的说明
  3. [python] 线程锁
  4. C# LINQ详解(一)
  5. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(48)-工作流设计-起草新申请
  6. 设置Oracle用IP远程连接和客户端访问
  7. Leetcode easy
  8. ios随机数
  9. JSONP原理解析
  10. ps图层的基本使用
  11. java idea导入ecli项目
  12. Codeforces Round #349 (Div. 1)E. Forensic Examination
  13. 【刷题】BZOJ 2407 探险
  14. var_dump()函数输出不完整,有省略号?解决办法
  15. ArrayList初步
  16. studying Bitcoin
  17. for循环 底层工作原理
  18. 转-Python自然语言处理入门
  19. Linq lambda 匿名方法
  20. 一款基于的jQuery仿苹果样式焦点图插件

热门文章

  1. Android 简单案例:继承BaseAdapter实现Adapter
  2. 内网安全监控和预警平台架构设想(OSSIM)
  3. 1.Math函数对象
  4. 使用ThreadLocal在线程内部传递数据
  5. ts和js中let和var定义变量的区别
  6. [转帖]双剑合璧:CPU+GPU异构计算完全解析
  7. 下载组件Jspsmartupload中文乱码解决办法
  8. 了解MIP(Mobile Instant Pages)
  9. Oracle安装部署之RAC安装环境配置脚本
  10. Why Choose Jetty?