1.2 并发控制
  1.2.1 读写锁
    在处理并发读或写时,通过实现一个由两种类型的锁组成的锁系统来解决问题。这两种类型的锁通常被称为 共享锁(shared lock) 和 排它锁(exclusive lock),也叫读锁(read lock)和写锁(write lock)。
    读锁是共享的,或者说是不互相阻塞的。多个客户端可以在同一时刻读取同一个资源,而互不干扰。写锁则是排他的,也就是说一个写锁会阻塞其他写锁和读锁。
  1.2.2 锁粒度
    为了提高共享资源的并发性,尽量只锁定需要修改的部分数据,而不是所有数据。
    表锁(table lock)

      表锁是MySQL中最基本的锁策略,并且是开销最小的策略。进行写操作(插入、删除、更新等)先需要获得写锁,这会阻塞其他用户对该表的所有读写操作。读锁之间是不相互阻塞的。写锁有比读锁更高的优先级,因此一个写锁请求可能会被插入到读锁队列的前面(写锁可以插入到锁队列的前面,反之读锁则不能插入到写锁的前面)。
      ALTER TABLE之类的语句会使用表锁,并且会忽略存储引擎的锁机制。
    行级锁(row lock)
      行级锁可以最大限度的支持并发处理,但同时也到来了最大的锁开销。MySQL的InnoDB和XtraDB等存储引擎实现了行级锁。行级锁只在存储引擎层面实现,并且服务器层完全不了解存储引擎中的锁实现。
1.3 事务
  事务就是一组原子性的SQL查询,这组查询要么全部执行成功,要么全部执行失败。
  事务的ACID概念:
    原子性(atomicity):一个事务必需被视为一个不可分割的最小工作单元。
    一致性(consistency):
    隔离性(isolation):通常来说,一个事务所做的修改在最终提交以前,对其他事务是不可见的(也取决与隔离级别(Isolation level))。
    持久性(durability):一旦事务提交,则其所做的修改就会永久保存到数据库中。
  1.3.1 隔离级别
    SQL中定义了四种隔离级别:
      READ UNCOMMITTED(未提交读): 事务中的修改,即使没有提交,对其他事务也都是可见的,事务可以读取未提交的数据,也被称为脏读(Dirty Read),不推荐使用。
      READ COMMITTED(提交读): 一个事务开始时,只能看见已经提交了的事务所做的修改,也就是说,一个事务从开始直到提交之前,所做的任何修改对其他事务都是不可见的。
      REPEATABLE READ(可重复读): 解决了脏读的问题,保证在同一个事务中,多次读取同样的记录的结果是一致的。可重复读是MySQL的默认事务隔离级别。
      SERIALIZABLE(可串行化): 可串行化是最高的隔离级别,通过强制事务串行执行,避免了幻读的问题,但会导致大量的超时和锁争用的问题。
    幻读(Phantom Read): 当某个事务在读取某个范围内的记录时,另一个事务又在该范围插入了新的记录,当之前的事务再次读取该范围内的记录时,会产生幻行(Phantom Row)。
  1.3.2 死锁
    死锁是指两个或多个事务在同一资源上互相占用,并请求锁定对方占用的资源,从而导致恶性循环的现象。死锁的产生有双重原因:有些是因为真正的数据冲突,有些是存储引擎的实现方式导致的。
    InnoDB存储引擎,能检测到死锁的循环依赖,并立即返回一个错误。InnoDB目前的处理死锁的方法是:将持有最少行级排他锁的事务回滚。死锁发生时,只有部分或者完全回滚其中一个事务,才能打破僵局。大多数情况下,只需重新执行因死锁回滚的事务即可。
1.4 多版本并发控制(MVCC)
  可以认为MVCC是行级锁的一个变种,实现了非阻塞的读操作,写操作也只锁定必要的行。
  MVCC的实现,是通过保存数据在某个时间点的快照来实现的。对于多个事务,根据事务开始时间不同,每个事务对同一张表,在同一时刻看到的数据可能是不一样的。
  InnoDB的MVCC,是通过在每行记录的后面保存两个隐藏的列来实现的。这两个列,一个保存行的创建时间,一个保存行的过期时间(或删除时间)。当然存储的并不是实际的时间值,而是系统版本号(system version number)。每开始一个事务,系统版本号都会自动递增。事务开始时刻的系统版本号会作为事务的版本号,用来和查询到的每行记录的版本号进行比较。
  REPEATABLE READ隔离级别下,MVCC具体操作方式:
    SELECT:InnoDB会根据一下两个条件检查每行记录:
      a. InnoDB只查找版本号早于当前事务版本的数据行(行的系统版本号小于或等于事务的系统版本号),这样可以保证事务读取的行,要么是在事务开始之前已经存在的,要么是事务自身插入的或者修改过的。
      b. 行的删除版本要么未定义,要么大于当前事务的版本号。这可以确保事务读取到的行,在事务开始之前未被删除。
    INSERT:
      InnoDB为新插入的每一行保存当前系统版本号作为行版本号。
    DELETE:
      InnoDB为删除的每一行保存当前系统版本号作为行删除标识。
    UPDATE:
      InnoDB为插入的一行新记录,保存当前系统版本号作为行版本号,同时保存当前系统版本号到原来的行作为行删除标识。

  MVCC只在REPEATABLE READ和READ COMMITTED两个隔离级别下工作。

如果您觉得阅读本文对您有帮助,欢迎转载本文,但是转载文章之后必须在文章页面明显位置保留此段声明,否则保留追究法律责任的权利。

作  者:blog.jpdou.top

原文链接:http://blog.jpdou.top/high-performance-mysql-architecture/

《高性能MySQL》读书笔记之 MySQL锁、事务、多版本并发控制的基础知识的更多相关文章

  1. 【MySQL 读书笔记】RR(REPEATABLE-READ)事务隔离详解

    这篇我觉得有点难度,我会更慢的更详细的分析一些 case . MySQL 的默认事务隔离级别和其他几个主流数据库隔离级别不同,他的事务隔离级别是 RR(REPEATABLE-READ) 其他的主流数据 ...

  2. 【MySQL 读书笔记】全局锁 | 表锁 | 行锁

    全局锁 全局锁是针对数据库实例的直接加锁,MySQL 提供了一个加全局锁的方法, Flush tables with read lock 可以使用锁将整个表的增删改操作都锁上其中包括 ddl 语句,只 ...

  3. 读书笔记-《Mysql技术内幕》

    MYSQL 技术内幕 Mysql体系 连接池组件 管理服务和工具 SQL接口 查询分析器 优化器 缓冲 插件式存储引擎 物理文件 存储引擎 InnoDB(默认引擎) 支持事务 行锁设计 多版本并发控制 ...

  4. 《高性能MySQL》读书笔记--锁、事务、隔离级别 转

    1.锁 为什么需要锁?因为数据库要解决并发控制问题.在同一时刻,可能会有多个客户端对表中同一行记录进行操作,比如有的在读取该行数据,其他的尝试去删除它.为了保证数据的一致性,数据库就要对这种并发操作进 ...

  5. 高性能MySQL --- 读书笔记(1) - 2016/8/2

    此书不但帮助MySQL初学者提高使用技巧,更为有经验的MySQL DBA指出了开发高性能MySQL应用的途径.全书包括14章,内容覆盖MySQL系统架构.设计应用技巧.SQL语句优化.服务器性能调优. ...

  6. 高性能MySQL --- 读书笔记(2) - 2016/8/2

    第1章 MySQL架构 MySQL架构与其他数据库服务器大不相同,这使它能够适应广泛的应用.MySQL足够灵活,能适应高要求架构.例如Web应用,同时还适用于嵌入式应用.数据仓库.内容索引和分发软件. ...

  7. 【MySQL 读书笔记】当我们在执行该查询语句的时候我们在干什么

    看了非常多 MySQL 相关的书籍和文章,没有看到过如此优秀的专栏.所以未来一段时间我会梳理读完该专栏的所学所得. 当我们在执行该查询语句的时候我们在干什么 mysql> select * fr ...

  8. 【MySQL 读书笔记】普通索引和唯一索引应该怎么选择

    通常我们在做这个选择的时候,考虑得最多的应该是如果我们需要让 Database MySQL 来帮助我们从数据库层面过滤掉对应字段的重复数据我们会选择唯一索引,如果没有前者的需求,一般都会使用普通索引. ...

  9. 【MySQL 读书笔记】SQL 刷脏页可能造成数据库抖动

    开始今天读书笔记之前我觉得需要回顾一下当我们在更新一条数据的时候做了什么. 因为 WAL 技术的存在,所以当我们执行一条更新语句的时候是先写日志,后写磁盘的.当我们在内存中写入了 redolog 之后 ...

随机推荐

  1. mysql 数据库修改用户名和密码

    因为经常修改数据库密码,也找到了几种修改数据库密码的方式,在这里给大家介绍下供大家参考通过navicat 管理数据库客户端来修改数据库密码: 选择数据库 --- 点击导航条的用户  --- 编辑用户 ...

  2. 「LOJ#103」子串查找 (Hash

    题目描述 这是一道模板题. 给定一个字符串 A A A 和一个字符串 B B B,求 B B B 在 A A A 中的出现次数.AAA 和 BBB 中的字符均为英语大写字母或小写字母. A A A 中 ...

  3. dockerfile_nginx+PHP+mongo数据库_完美搭建

      基于dockerfile创建nginx+PHP+mongo数据库_完美搭建     第一步:   从git上:git clone http://git.oursdata.com/wangyue/d ...

  4. bzoj4520

    KD-tree+堆 多年大坑 KD-tree已经是半年前学的了,忘记了.这道题当时一直T,今天重新抄了一遍,A了 KD-tree过程:1.建树:每次依次按x,y划分平面,像二叉搜索树一样建树,每个点维 ...

  5. 通过上一节部署出来的 Windows instance 有时候会发现操作系统时间总是慢 8 个小时,即使手工调整好时间和时区,下次 instance 重启后又会差 8 个小时

    这是 OpenStack 实施经验分享系列的第 3 篇. 问题描述 通过上一节部署出来的 Windows instance 有时候会发现操作系统时间总是慢 8 个小时,即使手工调整好时间和时区,下次 ...

  6. Prime Independence

    题意: 对于给定集合,求解最大的子集合,使得集合内两两之商不为质数. 解法: 考虑对于每一个数字分解质因数可以得到 $O(nloglogNUM)$ 条两个数字不可以出现在同一集合的信息. 同时发现一条 ...

  7. Paint Tree

    题意: 给定一棵n个点的树,给定平面上n个点,将n个点用线段连起来画成树的形状,使得不存在不在端点相交的线段,构造出一种情况. 解法: 首先观察我们常规画出来的树形图可知,树的子树是根据极角分开的,这 ...

  8. HDOJ-2047

    阿牛的EOF牛肉串 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total S ...

  9. 解决“System.Data.OracleClient需要Oracle客户端软件8.1.7或更高版本”

    问题描述:远程访问该数据库(客户端同样是Oracle11g)提示“System.Data.OracleClient需要Oracle客户端软件8.1.7或更高版本”. 解决的办法: 1.一定要关闭Win ...

  10. war,jar包是啥

    http://www.blogjava.net/athrunwang/archive/2011/11/18/364191.html 经常听开发说war,jar,car,这些是个什么东东呢? .jar  ...