1. 意向锁
https://dev.mysql.com/doc/refman/5.7/en/innodb-locking.html#innodb-insert-intention-locks
官方文档,意向锁是Innodb为了支持多种粒度锁(表锁+行锁)设计的。
举例:
一个表 tab1
id, name
2, "xxxx"
id是unique key。
事务T1 select ... from tab1 where id=2 for update.
事务T2 lock tab1 .... write。
若无意向锁,事务T2需扫描表的每一行,看下是否有锁。
有了意向锁后,T2只需判断与T1的意向锁是否兼容即可。
2. Gap锁
Gap locks in InnoDB
are “purely inhibitive”, which means that their only purpose is to prevent other transactions from inserting to the gap. Gap locks can co-exist. A gap lock taken by one transaction does not prevent another transaction from taking a gap lock on the same gap. There is no difference between shared and exclusive gap locks. They do not conflict with each other, and they perform the same function.
3. Next-Key Locks
是Gap锁 与 Record Locks的结合,区间为前开后闭。如一个index 有10, 11, 13, and 20几条记录,则可能存在的Next-Key Locks是:
(negative infinity, 10]
(10, 11]
(11, 13]
(13, 20]
(20, positive infinity)
Next-Key Locks用于RR事务隔离级别,解决幻读问题。
4. insert intention locks
插入意向锁是一种特殊的Gap锁,它不属于上述1. 意向锁,因为意向锁是表锁,而插入意向锁是行锁。
举例:
有一张表
mysql> CREATE TABLE child (id int(11) NOT NULL, PRIMARY KEY(id)) ENGINE=InnoDB;
mysql> INSERT INTO child (id) values (90),(102);
现在事务T1插入id=100,
事务T2插入id=101
则T1,1-获得(90,102)的gap locks, 2-获得id=100的record locks
事务T2,1-获得(90, 102)的gap locks, 2-获得id=101的record locks
两者的插入互不影响。(insert intention locks为解决并发)
但若T1
START TRANSACTION;
SELECT * FROM child WHERE id > 100 FOR UPDATE;
T1的锁包含了(100, 102)的gap锁和 id>100的X锁
此时T2
START TRANSACTION;
INSERT INTO child (id) VALUES (101);
会获得(90, 102)的Gap锁,但会等待id=101的独占锁。
最后,不同的SQL语句对应的锁如下描述:
https://dev.mysql.com/doc/refman/5.7/en/innodb-locks-set.html
注意insert 与insert on duplicate 的区别,即在检测到on duplicate后,insert加一个S锁,而insert on duplicate 在UK加一个X Next-Key locks. 在PK加一个X record locks。
以及死锁产生示例
mysql locking的更多相关文章
-
detecting locked tables mysql (locked by LOCK TABLE)
detecting locked tables mysql (locked by LOCK TABLE) up vote15down votefavorite 7 I would like to kn ...
-
MySQL 之 Metadata Locking 研究
MySQL5.5 中引入了 metadata lock. 顾名思义,metadata lock 不是为了保护表中的数据的,而是保护 database objects(元数据)的.包括表结构.schem ...
-
转 MYSQL SELECT ... FOR UPDATE and SELECT ... LOCK IN SHARE MODE Locking Reads
原文: http://dev.mysql.com/doc/refman/5.0/en/innodb-locking-reads.html In some circumstances, a consis ...
-
转 mysql Next-Key Locking
原文:http://dev.mysql.com/doc/refman/5.5/en/innodb-next-key-locking.html 14.5.2.5 Avoiding the Phantom ...
-
(笔记)MySQL 之 Metadata Locking 研究(5.5版本)
MySQL5.5 中引入了 metadata lock. 顾名思义,metadata lock 不是为了保护表中的数据的,而是保护 database objects(元数据)的.包括表结构.sch ...
-
MySQL 5.6 Reference Manual-14.3 InnoDB Transaction Model and Locking
14.3 InnoDB Transaction Model and Locking 14.3.1 InnoDB Lock Modes 14.3.2 InnoDB Record, Gap, and Ne ...
-
转 How to Find Out Who Is Locking a Table in MySQL
MySQL is adding more tools to monitor its internals with every new release, but one thing it still l ...
-
Mysql加锁过程详解
1.背景 MySQL/InnoDB的加锁分析,一直是一个比较困难的话题.我在工作过程中,经常会有同事咨询这方面的问题.同时,微博上也经常会收到MySQL锁相关的私信,让我帮助解决一些死锁的问题.本文, ...
-
详细介绍Mysql各种存储引擎的特性以及如何选择存储引擎
最近业务上有要求,要实现类似oracle 的dblink linux版本 Server version: 5.6.28-0ubuntu0.14.04.1 (Ubuntu) 修改配置文件 /etc/ ...
随机推荐
-
Samba快速配置
Samba是linux,unix,windows之间进行交互操作的软件组件,Sanma是基于GPL协议的*开源软件. 快速配置samba文件服务器 1.关闭防火墙和SELinux [root@cen ...
-
bootstrap-tab
功能:点击时切换相应的内容或图片 插件:tab.js 要点:tab标签用在导航条上,以data-toggle作被点击者, 以tab-content作内容显示 <!DOCTYPE html> ...
-
subversion 版本库数据迁移 从一台服务器迁移到另一台新有服务器
[root@NGINX-APACHE-SVN pro]# pwd /var/www/html/svn/pro [root@NGINX-APACHE-SVN pro]# svnadmin dump /v ...
-
Python基础学习参考(四):条件与循环
在实际的开发中,想要实现某些功能或者需求,里面必然涉及到一些逻辑,复杂的也好简单也好,那么,通过python语法如何实现呢?这就涉及到了条件与循环.很显然绝大多数的语言都有条件和循环的语法,pytho ...
-
zt 正则
http://deerchao.net/tutorials/regex/regex.htm 正则表达式30分钟入门教程 版本:v2.3.5 (2017-6-12) 作者:deerchao 转载 ...
-
TF之AE:AE实现TF自带数据集AE的encoder之后decoder之前的非监督学习分类—Jason niu
import tensorflow as tf import numpy as np import matplotlib.pyplot as plt #Import MNIST data from t ...
-
测试WCF遇到的一些问题
win7+iis7 1.localhost访问bad request错误. 主机地址不要指定为127.0.0.1.设置为”全部未分配“. 2.错误 500.19(由于权限不足而无法读取配置文件)的问题 ...
-
jquery的$.extend和$.fn.extend作用及区别,兼它们的一些小细节
$.extend(obj);是为了扩展jquery本身,为类添加新的方法 $.fn.extend(obj);给JQUERY对象添加方法.如(1): $.extend({ add:function( ...
-
codeforces 350 div2 D Magic Powder - 2 二分
D2. Magic Powder - 2 time limit per test 1 second memory limit per test 256 megabytes input standard ...
-
【Linux】正确的关机方法
1)shutdown命令 我们较常使用的是shutdown这个命令,这个命令可以安全地关闭或重启Linux系统,它在系统关闭之前给系统上的所有登录用户提示一条警告信息.该命令还允许用户指定一个时间参数 ...