《高性能mysql》读书笔记之mysql锁事务多版本并发控制的基础知识

窦金鹏的博客 窦金鹏的博客     2022-07-31     268

关键词:

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两个隔离级别下工作。

《高性能mysql》读书笔记之创建高性能的索引

索引是存储引擎用于快速找到记录的一种数据结构。索引优化是对查询性能优化的最有效手段。索引能够轻易将查询性能提高几个数量级。创建一个最优的索引经常需要重写查询。5.1 索引基础   在MySQL中,存储引擎首先在索... 查看详情

高性能mysql读书笔记--mysql基准测试

基准测试是什么?简单来说,基准测试是则很难对系统设计的一种压力测试,通常的目标是为了掌握系统的行为。但也有其他原因。比如重现某个系统状态,或者是做新硬件的可靠性测试。为什么需要基准测试因... 查看详情

高性能mysql之事务

高性能MySQL事务:概念:事务是一组原子性的sql查询,一个独立的工作单元。事务内的语句要么全部执行成功,要么全部执行失败。银行转账是解释事务重要性的一个经典例子。比如:客户A要向客户B转账200元,需要三个步骤:1... 查看详情

数据库篇:mysql事务原理之mvcc视图+锁

...,并发性能好对于使用READCOMMITTED和REPEATABLEREAD隔离级别的事务来说,都必须保证读到已提交事务修改过的记录,也就是说假如另一个事务修改了记录但尚未提交,是不能读取最新版本的记录的,其核心问题:需要判断MVCC版本链... 查看详情

mysql学习笔记之事务

(一)什么是事务??事务其实就是一个完整的业务逻辑,不可再分,是一个最小的工作单元。准确来说,一个事务就是批量的DML语句同时成功或者同时失败。说明:只有DML语句与事务有关系,其他语句与事务无关DML语句:insert... 查看详情

高性能mysql之锁机制

并发控制 并发控制的任务是确保当多个事务同时修改数据库中同一个数据时,不破坏事务的隔离性和一致性。锁 当并发事务同时访问一个资源时,有可能导致数据不一致,因此需要一种机制来将数据访问顺序化,以保证... 查看详情

《mysqldba修炼之道》读书笔记(第一章理解mysql)

1、MySQL的基础架构    1.MySQL是一种关系数据库产品,是建立在关系模型基础上的数据库。架构一般可分为应用层、逻辑层、物理层。应用层:负责和客户端、用户进行交互。逻辑层:负责具体的查询处理、事物管... 查看详情

mysql学习笔记(全)(代码片段)

目录MyISAM和InnoDB性能下降SQL慢的原因:Mysql执行顺序SQLJoin索引索引的优劣索引分类mysql索引结构那些情况建索引哪些情况不要建索引性能分析Extra索引优化索引口诀索引案例OrderBy索引优化exsitesMysql慢查询日志命令函数操作批... 查看详情

高性能mysql卷一之架构分析(代码片段)

高性能MySQL卷一之架构分析Mysql架构优化与执行并发控制读写锁锁粒度表锁行级锁事务隔离级别死锁事务日志MYSQL中的事务自动提交在事务中混合使用存储引擎隐式和显示锁定多版本并发控制存储引擎InnoDB存储引擎MyISAM存储引擎转... 查看详情

2017年读书清单

...去完成!技术方面序号书名类别作者出版社读完时间1《高性能MySQL(第3版)》mysql宁海元,周振兴,彭立勋等译电子工业出版社2《MySQL管理之道:性能调优、高可用与监控(第一版)》mysql贺春旸 著机械工业出版社3《Python核... 查看详情

mysql之事务和锁机制(代码片段)

文章目录一、事务1.1事务特征1.2隔离级别1.3开启事务二、锁机制2.1读锁、写锁2.2全局锁、表锁、行锁2.3记录锁、间隙锁、临键锁提示:以下是本篇文章正文内容,MySQL系列学习将会持续更新一、事务在数据库里面,我... 查看详情

mysql中那些锁机制之innodb

...道mysql在以前,存储引擎默认是MyISAM,但是随着对事务和并发的要求越来越高,便引入了InnoDB引擎,它具有支持事务安全等一系列特性。 InnoDB锁模式 InnoDB实现了两种类型的行锁。共享锁(S):允许一... 查看详情

mysql数据库同步之悲观锁和乐观锁

...口悲观锁它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,在整个数据处理过程中,将数据处于锁定状态。悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层提... 查看详情

mysql数据库同步之悲观锁和乐观锁

...口悲观锁它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,在整个数据处理过程中,将数据处于锁定状态。悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层提... 查看详情

mysql死锁过程及案例详解之元数据锁metadatalock(代码片段)

...aLock元数据锁MetaDataLocks的主要作用是在执行查询或者发起事务时元数据结构受到保护,即不被修改。MetaDataLock是表级锁。MetaDataLock是排他锁,当该锁存在时不能有其它的连接对表的模式进行修改。关于元数据锁的最大问... 查看详情

mysql高级学习笔记(代码片段)

文章目录MySQL基础篇学习笔记SQL性能下降的原因SQL的执行顺序索引索引的优劣势索引的分类索引的创建索引结构判断是否需要创建索引EXPLAINEXPLAIN之idEXPLAIN之select_typeEXPLAIN之tableEXPLAIN之typeEXPLAIN之possible_keysEXPLAIN之keyEXPLAIN之key_lenEX... 查看详情

mysql:索引事务(代码片段)

参考:狂神说Mysql视频高性能Mysql文章目录1.索引简介2.EXPLAIN关键字一百万条数据测试3.索引原理B-Tree**为什么说B+树比B-树更适合实际应用中操作系统的文件索引和数据库索引?**Hash索引索引的方式4.存储引擎对比5.事务... 查看详情

mysql面试题之死锁

...问题?通过数据库哪些表可以监控?死锁是指两个或多个事务在同一资源上互相占用,并请求加锁时,而导致的恶性循环现象。当多个事务以不同顺序试图加锁同一资源时,就会产生死锁。锁等待:mysql数据库中,不同session在更... 查看详情