内容主要是对mysql文档的翻译。

1. shared(s) 共享锁
2. exclusive(x) 排它锁

innodb的s锁和x锁是行级锁。
事务T1获得s锁,事务T2仍然可以获得s锁。
事务T1获得x锁,事务T2只有在T1释放该锁后,才能获得x锁。
共享锁的作用是,就像在说“我现在要读这条数据,你们不要改它”。
排它锁就是:“我现在要改这条数据,所以你们不要改,也不要读”

3. Intention Locks
意向锁
innodb支持允许行级锁和表级锁共存的多粒度锁。为了使多粒度锁能实用,使用了一种被称为意向锁的附加类型的锁。意向锁是innodb中的表级锁,它表明一个事务为了表中的某一行后续需要哪种类型的锁(共享或排他)。在innodb中使用了2种意向锁(假定事务T请求了表 t 某种类型的锁):
intention shared(IS): 事务T想要对表 t 中的某些行加s锁。
intention exclusive(IX):事务T想要对表 t 中的某些行加x锁。

例如:select ... lock in share mode 加IS锁,而 select ... for update 加IX锁。
意向锁的规则如下:
在一个事务获取表t中某行的s锁之前,它必须先获取一个表t的IS锁或者更强的锁。
在一个事务获取表t中某行的x锁之前,它必须先获取一个表t的IX锁。

一个锁会赋予给请求事务,如果请求的锁与事务现有的锁兼容。事务会等待直到现有的冲突锁被释放。如果一个请求的锁和现有的锁冲突了,导致无法获取锁,这会导致死锁,出错。
因此,意向锁不会阻塞任何事,除了对整张表的请求(lock table ... write)。IX和IS锁的主要作用是告诉别人,有人正在锁住某行记录,或者将要锁住表中的某行。

4. Record Locks 记录锁
一个记录锁是一条索引记录的锁。例如, SELECT c1 FROM t WHERE c1 = 10 FOR UPDATE; 阻止其他事务插入,更新或删除t.c1值等于10的行。
记录锁通常锁住索引记录,即使一张表并没有定义索引。针对这样的情况,innodb创建一种隐藏的聚集索引,并且使用这种索引来锁住记录。看Section 14.8.9, “Clustered and Secondary Indexes”。

5. Gap Locks 间隙锁
间隙锁是索引记录的间隙上的锁,或者是第一行之前的间隙,或者最后一行之后的间隙。例如,
select c1 from t where c1 between 10 and 20 for update; 阻止其他事务插入t.c1等于15的行,不管表中是否存在t.c1等于15,因为在该范围内,所有现有值之间的间隙都被锁定。

一个间隙可能包含0个、一个、多个索引值。

间隙锁是一种性能和并发之间的折中,使用在某些事务隔离级别上。
对于通过使用唯一索引查询某一行并锁住该行的语句,并不需要间隙锁。(查询条件中只包含“多列唯一索引”的部分列,这种情况仍然会产生间隙锁)。例如,id列有唯一索引,下面的语句只对id等于100的行用了索引记录锁,不会影响其他事务在这个间隙内插入行。
select * from child where id = 100;

如果id列没有索引,或者有非唯一索引,上面的语句会锁住间隙。
这里值得注意的是:不同的事务可以在一个间隙上持有冲突锁。例如,事务A可以持有一个共享间隙锁(gap S-lock),同时事务B在相同的间隙上持有排他间隙锁(gap X-lock)。允许冲突的间隙锁的原因是:如果一条记录根据索引被清除了,不同事务在这条记录上的间隙锁必须合并。

innodb中的间隙锁是“单纯禁止的”,意味着他门只堵塞其他事务往间隙内插入数据。他门不会阻止其他事务从相同的间隙获取锁。因此,gap X-lock和gap S-lock的效果是一样的。

间隙锁可以显式地被关闭。这会发生,当你设置事务隔离级别为读已提交或者使innodb_locks_unsafe_for_binlog (现在已经废弃)系统变量生效。在这些情况下,间隙锁对于查询,索引扫描没有启用,只在外键约束检查和重复键检查时起作用。

设置事务隔离级别为读已提交,或者使innodb_locks_unsafe_for_binlog系统变量生效也有其他作用。当MySQL计算where表达式后,非匹配行上的记录锁会被释放。对于update语句,innodb做了一次“半一致性读”,所以它返回最新的提交版本给mysql,所以mysql能决定行是否匹配update的where条件。

6. Next-Key Locks
Next-Key 锁是两种锁的结合:索引记录上的记录锁和在索引记录前的间隙上的间隙锁。

innodb 采用行级锁,导致当它查询或扫描一个表索引时,它会在遇到的的索引记录上加共享或排他锁。因此,
行级锁实际上是索引记录锁。一条索引记录上的next-key锁也会影响索引记录前的“间隙”。那就是,next-key锁是索引记录锁
加上索引记录前的间隙的间隙锁。如果一个会话拥有索引记录R上的共享锁或排他锁,另一个会话不能立刻在R索引顺序前面的间隙中插入新的索引记录。
假定一个索引包含值10, 11, 13, 和 20。这个索引可能的next-key锁覆盖下面的间隔,一个圆括号表示开区间,方括号表示闭区间:
(negative infinity, 10]
(10, 11]
(11, 13]
(13, 20]
(20, positive infinity)
最后一个间隔,next-key锁锁住索引中最大值和大于索引中任何值的“上界”的间隙。这个上界不是真实的索引记录,所以,效果上,这个next-key锁只锁住了包含最大索引值的间隙。

默认地,innodb 运行在可重复读事务隔离级别,设置 innodb_locks_unsafe_for_binlog 系统变量为disabled。在这种情况下,innodb 在查询和索引扫描时使用next-key锁,以阻止幻影行。

7. Insert Intention Locks
插入意向锁

插入意向锁是一种间隙锁,插入操作加的在插入行前的间隙锁。锁以这种方式提示插入的意向,导致不同事务插入相同索引间隙不需要等待其他人,如果他们不是插入间隙中的相同位置。
假定,存在值4和7的索引记录,分别有两个事务试图插入5和6,每个事务在获得已插入行的排他锁之前,分别用插入意向锁锁住4和7之间的间隙,但是不会阻塞其他人因为插入的行是不冲突的。

下面的例子展示一个事务在获得插入记录的排他锁之前,会获取插入意向锁。示例中涉及2个客户端,A和B。
A创建一张包含2条索引记录(90和102)的表,然后开始一个事务,用大于100的id在索引记录上加排他锁。排他锁包含记录102钱的间隙锁。
mysql> CREATE TABLE child (id int(11) NOT NULL, PRIMARY KEY(id)) ENGINE=InnoDB;
mysql> INSERT INTO child (id) values (90),(102);

mysql> START TRANSACTION;
mysql> SELECT * FROM child WHERE id > 100 FOR UPDATE;

B开始一个事务,往间隙中插入一条记录。事务在等待获得排他锁时,加上插入意向锁。
mysql> START TRANSACTION;
mysql> INSERT INTO child (id) VALUES (101);

8. AUTO-INC Locks
自动增长锁

AUTO-INC锁是一种特别的表级锁,当事务向表中插入自动增长的列时需要获取这种锁。最简单的情形,如果一个事务在向表中插入值,任何其他事务向该表插入数据时必须
等待,这样第一个事务中插入的行才能收到连续的主键值。

innodb_autoinc_lock_mode配置项,控制着自增长锁的算法。它允许你选择如何在可预测的自增值的序列和插入操作的最大并发之间折中。

更多信息,查看 Section 14.8.1.5, “AUTO_INCREMENT Handling in InnoDB”.

Mysql锁(翻译)的更多相关文章

  1. MySQL锁这块石头似乎没有我想的那么重

    前言 前言为本人写这篇文章的牢骚,建议跳过不看.   之前好几次都想好好的学习MySQL中的锁,但是找了几篇文章,看了一些锁的类型有那么多种,一时间也没看懂是什么意思,于是跟自己说先放松下自己,便从书 ...

  2. mysql锁

    锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除传统的计算资源(如CPU.RAM.I/O等)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性.有效性是所有数 ...

  3. Mysql锁初步

    存储引擎 要了解mysql的锁,就要先从存储引擎说起. 常用存储引擎列表如下图所示: 最常使用的两种存储引擎: Myisam是Mysql的默认存储引擎.当create创建新表时,未指定新表的存储引擎时 ...

  4. mysql锁表机制及相关优化

    (该文章为方便自己查阅,也希望对大家有所帮助,转载于互联网) 1. 锁机制 当前MySQL支持 ISAM, MyISAM, MEMORY (HEAP) 类型表的表级锁,BDB 表支持页级锁,InnoD ...

  5. MySQL锁系列3 MDL锁

    http://www.cnblogs.com/xpchild/p/3790139.html   MySQL为了保护数据字典元数据,使用了metadata lock,即MDL锁,保证在并发的情况下,结构 ...

  6. 01 MySQL锁概述

    锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除传统的计算资源(如CPU.RAM.I/O 等)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性.有效性是所有 ...

  7. Mysql锁机制介绍

    Mysql锁机制介绍 一.概况MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制.比如,MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking ...

  8. MySQL锁等待分析【2】

    MySQL锁等待分析[1]中对锁等待的分析是一步一步来的.虽然最后是分析出来了,可是用时是比较长的:理清各个表之间的关系后,得到如下SQL语句,方便以后使用 select block_trx.trx_ ...

  9. MySQL锁与MVCC

    --MySQL锁与MVCC --------------------2014/06/29 myisam表锁比较简单,这里主要讨论一下innodb的锁相关问题. innodb相比oracle锁机制简单许 ...

  10. MySQL锁总结

    本文同时发表在https://github.com/zhangyachen/zhangyachen.github.io/issues/78 MySQL 锁基础 参考了何登成老师文章的结构MySQL 加 ...

随机推荐

  1. hrbust 2080链表 【贪心】

    仔细看题想想就是个贪心题,两个sort就可以解决了 #include<stdio.h> #include<string.h> #include<math.h> #i ...

  2. HDUOJ 不容易系列之(4)——考新郎

    题目链接http://acm.hdu.edu.cn/showproblem.php?pid=2049 一开始我的想法就是使用错排公式,先使用全排列从N对中选出M对,然后再使用错排对选出的M对进行错排计 ...

  3. 力扣(LeetCode)1002. 查找常用字符

    给定仅有小写字母组成的字符串数组 A,返回列表中的每个字符串中都显示的全部字符(包括重复字符)组成的列表.例如,如果一个字符在每个字符串中出现 3 次,但不是 4 次,则需要在最终答案中包含该字符 3 ...

  4. leecode第二十一题(合并两个有序链表)

    /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode ...

  5. Windows 多用户接续设置

    第1步:如果想真正实现多用户接续,请安装角色:remote desktop service.第2步: gpedit.msc,找到“计算机配置”-“管理模板”-“Windows 组件”-“远程桌面服务” ...

  6. MYSQL的常用函数(字符串函数)

    ASCII(char)返回字符的ASCII码值 BIT_LENGTH(str)返回字符串的比特长度 CONCAT(s1,s2...,sn)将s1,s2...,sn连接成字符串 CONCAT_WS(se ...

  7. Appium的工作原理

    把我们写的python语言代码,看做客户端 通过客户端向appium服务器发送请求 appium服务器把我们的代码转换成手机可以识别的指令 然后把指令发给手机,手机根据指令做出相应的操作 最后手机把操 ...

  8. docker 安装完mysql 后客户端无法访问

    1.在虚拟机的centos 中安装 docker 的mysql 镜像. docker run --name mysql01 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=12 ...

  9. 数据结构(C语言版)-第2章 线性表

    #define MAXSIZE 100 //最大长度 typedef struct { ElemType *elem; //指向数据元素的基地址 int length; //线性表的当前长度 }SqL ...

  10. 2.2 调试 HelloWorld.exe 程序