一些收藏

MySQL - 数据库锁机制

2022-09-28  本文已影响0人  右耳菌

1. 术语简介


2. 行锁之独占和共享

注:只要有锁就会有共享和排他之分


3. 间隙锁

gap间隙锁的定义:间隙锁是对索引记录之间的间隙的锁定。使用唯一特性的字段查询一行数据不使用间隙锁。

即遍历过的值都进行了锁定,含其中的间隙。但是如主键这种唯一值的,不会使用间隙锁。

其他的相关描述

单纯的间隙锁,【锁不存在的数据】
【Innodb中的实现】NEXT-KEY锁,特殊的间隙锁实现,单记录锁和间隙锁的组合
简单理解: 锁定遍历过的范围,锁定遍历过的已存在记录
特例: 使用唯一特性的字段查询一行数据不使用间隙锁(如主键)
为啥叫NEXT-KEY?要查询出需要的N条数据,需要遍历N+1次;(一直找一直找,找到一条不满足条件的为止:)

【注意】把事务的隔离级别降级为读提交(Read Committed,RC),间隙锁则会自动失效

如果把事务的隔离级别降级为读提交(Read Committed, RC),间隙锁则会自动失效。
间隙锁只存在特定的隔离级别中。


4. Predicate Locks

Innodb支持对包含空间列的列进行SPATIAL索引。
多维数据中没有绝对排序概念,不好界定锁定范围。

NEXT-KEY 锁机制不能很好地支持REPEATABLE READ或SERIALIZABBLE事务隔离级别。
为了支持具有SPATIAL索引的表的隔离级别,InnoDB引入了Predicate Locks。

Spatial索引包含最小外接矩形值,因此InnoDB通过在用于查询的MBR值上设置Predicate Locks来强制对索引进行一致读取,其他事务不能插入或修改与查询条件匹配的行

简单理解: 以查询条件为依据来加锁,而不是通过数据本身的信息。


5. Server层的MDL锁

元数据锁不依赖任何存储引擎。此锁不需要显示调用,只要有事务在执行,对应的连接就会取得元数据锁。当事务执行的时候理论上是不能容忍表结构在中途发生改变。

  1. 分为MDL 读锁写锁 两种。读锁和写锁互斥;
  2. select和DML语句申请读锁。MDL读锁之间不冲突,所以多个select和DML语句可以同时执行;
  3. DDL语句申请写锁,获取写锁时需要等待读锁释放,且申请写锁会阻塞后续所有MDL锁的获取;

6. 表锁之独占和共享

7. 表锁之自增锁

Auto-inc锁是一种特殊的表级锁,和AUTO_INC、表级S锁以及X锁不相容。
AUTO_INC的加锁逻辑和InnoDB的锁模式相关。具体行为受到参数innodb_autoinc_lock_mode的影响。


如果觉得有收获,欢迎点赞和评论,更多知识,请点击关注查看我的主页信息哦~

上一篇 下一篇

猜你喜欢

热点阅读