本节描述所使用的锁类型InnoDB
。
InnoDB
实现标准的行级锁,有两种类型的锁,共享(年代
)锁和独家(X
)锁。
如果事务T1
拥有一个共享(年代
)锁定行r
,然后从一些不同的事务请求T2
行锁r
处理如下:
一个请求,
T2
对于一个年代
立即锁可以授予。因此,两者兼而有之T1
和T2
举行一次年代
锁上r
。一个请求,
T2
对于一个X
锁不能立即获得。
如果一个事务T1
拥有独家(X
)锁定行r
,请求从一些不同的事务T2
一个锁的类型r
不能立即获得。相反,事务T2
不得不等待事务T1
释放行锁r
。
InnoDB
支持多粒度锁它允许表锁和共存的行锁。例如,一个语句等锁表……写
需要独占锁(一个X
锁)在指定的表。在多个锁定粒度级别实用,InnoDB
使用意向锁。意向锁表级锁表明哪种类型的锁(共享或专用)事务要求后对表中的一行。有两种类型的意图锁:
例如,选择……为分享
设置一个是
锁,选择……更新
设置一个第九
锁。
意向锁协议如下:
在一个事务可以获取共享锁表中的一行,它必须首先获得一个
是
锁定或更强的放在桌子上。在一个事务可以获得独占锁定表中的一行,它必须首先获得一个
第九
锁在桌子上。
表级锁类型兼容性是归纳为如下的矩阵。
X |
第九 |
年代 |
是 |
|
---|---|---|---|---|
X |
冲突 | 冲突 | 冲突 | 冲突 |
第九 |
冲突 | 兼容的 | 冲突 | 兼容的 |
年代 |
冲突 | 冲突 | 兼容的 | 兼容的 |
是 |
冲突 | 兼容的 | 兼容的 | 兼容的 |
锁是授予一个请求事务是否兼容现有的锁,但如果它与现有的锁冲突。事务等待直到冲突现有释放锁。如果锁请求与现有的锁冲突和无法获得,因为它会导致死锁所示,出现一个错误。
意向锁不块除了全表请求(例如,锁表……写
)。意向锁的主要目的是证明有人锁定一行,或者去锁表中的一行。
事务数据的意图锁出现类似如下显示引擎INNODB状态
和InnoDB监控输出:
表锁表“测试”。“t”trx id 10080第九锁定模式
记录锁锁在一个索引记录。例如,选择10 c1从t c1 =更新;
防止其他事务插入、更新或删除行值t.c1
是10
。
记录锁总是锁索引记录,即使没有索引的表定义。在这种情况下,InnoDB
创建一个隐藏的聚集索引并使用这个索引记录锁定。看到部分15.6.2.1,“集群和二级索引”。
交易数据记录锁出现类似如下显示引擎INNODB状态
和InnoDB监控输出:
记录锁空间id 58页没有3 n位72指数的主要表“测试”。rec ' t ' trx id 10078 lock_mode X锁而不是空白记录锁,2号堆物理记录:n_fields 3;紧凑的格式;信息比特0 0:len 4;十六进制8000000;asc;;1:len 6;十六进制00000000274 f;asc的啊;;2:len 7; hex b60000019d0110; asc ;;
差距锁锁在差距指数记录,或锁定差距后的第一个或最后一个索引记录。例如,选择从t c1 c1 10至20更新;
防止其他事务插入的值15
成列t.c1
,是否已经有任何这样的值列,因为所有现有的值的范围之间的差距是锁着的。
差距可能会跨越一个索引值,多个索引值,甚至是空的。
锁的差距之间的权衡性能和并发性的一部分,并被用在一些事务隔离级别,而不是别人。
差距锁锁行不需要语句使用一个唯一索引搜索一个独特的行。(不包括这样的搜索条件只包含一些列多个列唯一索引;在这种情况下,差距锁定发生。)例如,如果id
列有唯一索引,下面的语句只使用一个索引记录锁的行id
价值100,不管其他会话前插入一个行差距:
SELECT * FROM孩子id = 100;
如果id
没有索引或者nonunique指数,该声明并锁前面的差距。
同样值得注意的是,锁冲突可以通过不同的事务举行一个缺口。例如,事务可以持有共享锁的差距(差距s锁)差距而事务B拥有独占锁的差距(差距独占锁)在相同的差距。允许差距锁冲突的原因是,如果一个记录从索引中被清除时,锁上举行的差距由不同的交易记录必须被合并。
差距锁住InnoDB
是”纯粹是禁止的”,这意味着他们唯一的目的是为了防止其他事务插入的差距。差距锁可以共存。差距锁由一个事务并不阻止另一个事务空档锁在相同的差距。没有区别共享和专用锁的差距。他们并不相互冲突,执行相同的功能。
明确差距锁可以禁用。如果你改变发生的事务隔离级别读过承诺
。锁定在这种情况下,差距是禁用的搜索和索引扫描和仅用于外键约束检查和重复键检查。
还有其他使用的影响读过承诺
隔离级别。记录锁nonmatching行的MySQL评估后被释放在哪里
条件。为更新
语句,InnoDB
一个”semi-consistent”读,这样它返回最新提交的版本MySQL MySQL可以决定是否匹配的行在哪里
的条件更新
。
键锁是记录锁的组合索引记录和差距锁之前的差距指数记录。
InnoDB
执行行级别锁定以这样一种方式,当它搜索或扫描表索引,它集共享或专用锁在它遇到的索引记录。因此,行级锁实际上是索引记录锁。第二个关键锁在一个索引记录也会影响”差距”在此之前索引记录。,第二个关键锁是一个索引记录锁+一个缺口锁之前的差距指数记录。如果一个会话共享或独占锁R
在索引,另一个会话不能插入一个新的索引记录之前的差距R
在索引中。
假设一个索引包含值10,11日13和20。可能的第二个关键锁指数涵盖以下的间隔,在区间端点的圆括弧表示排斥和端点的方括号表示包含:
(-∞,10)(10、11)(11、13](13日20](20,+∞)
在过去的时间间隔,第二个关键锁锁上面的差距指数和最大的价值”上确界”pseudo-record有价值高于任何价值实际上在索引中。上确界不是一个真正的索引记录,所以,实际上,这第二个关键锁锁只后的差距最大的索引值。
默认情况下,InnoDB
在可重复读取
事务隔离级别。在这种情况下,InnoDB
搜索和索引扫描使用键锁,防止幻象行(见部分15.7.4,“幻象行”)。
事务数据的第二个关键锁出现类似如下显示引擎INNODB状态
和InnoDB监控输出:
记录锁空间id 58页没有3 n位72指数的主要表“测试”。“t”trx id 10080 lock_mode X记录锁,堆第一物理记录:n_fields 1;紧凑的格式;信息比特0 0:len 8;十六进制73757072656 d756d;asc上确界;;记录锁,2号堆物理记录:n_fields 3;紧凑的格式;信息比特0 0:len 4;十六进制8000000; asc ;; 1: len 6; hex 00000000274f; asc 'O;; 2: len 7; hex b60000019d0110; asc ;;
插入目的设定的锁锁是一种差距插入
行之前插入操作。这把锁信号插入的意图,多个事务插入到相同的指数差距不需要等待对方如果不插入在同一位置内的差距。假设有索引记录的值4和7。单独的事务试图插入5和6的值,分别为每个锁4和7之间的差距与插入意图锁之前获得互斥型锁插入的行,但不要相互阻碍,因为行不冲突。
下面的示例演示了一个事务采取插入意图锁之前获得独占锁在插入记录。这个例子涉及两个客户,A和B。
客户端创建一个表包含两个索引记录(90年和102年),然后启动一个事务,独占锁在索引记录ID大于100。锁的互斥型锁包括差距在102年记录:
mysql >创建表子(int id(11)不是NULL,主键(id)引擎= InnoDB;mysql >插入子(id)值(90),(102);mysql >开始交易;mysql > SELECT *从孩子id > 100更新;+ - - - + | | id +——+ | 102 | +——+
客户机B开始一个事务记录插入空白。事务需要插入目的锁定在等待时获得独占锁。
mysql >开始交易;mysql >插入子(id)值(101);
事务数据的插入锁出现类似于下面的意图显示引擎INNODB状态
和InnoDB监控输出:
记录锁空间id 31页没有3 n位72指数的主要表“测试”。‘孩子’trx id 8731 lock_mode X锁差距rec之前插入意图等记录锁,3号堆物理记录:n_fields 3;紧凑的格式;信息比特0 0:len 4;十六进制80000066;asc f;;1:len 6;十六进制000000002215;asc”;;2:len 7; hex 9000000172011c; asc r ;;...
一个AUTO-INC
锁是一种特殊的表级锁的事务插入表AUTO_INCREMENT
列。在最简单的情况下,如果一个事务将值插入到表中,任何其他事务必须等待自己的插入到表中,所以,第一行插入事务得到连续的主键值。
的innodb_autoinc_lock_mode
变量控制算法用于自动递增锁定。它允许您选择如何预测自动递增值序列之间的权衡和最大并发插入操作。
有关更多信息,请参见部分15.6.1.6,“InnoDB AUTO_INCREMENT处理”。
InnoDB
支持空间
索引的列包含空间数据(见部分11.4.9,“优化空间分析”)。
为业务涉及处理锁定空间
索引,第二个关键锁定不工作的支持可重复读取
或可序列化的
事务隔离级别。没有绝对的命令在多维数据的概念,所以它是不清楚的”下一个”关键。
使支持表的隔离级别空间
索引,InnoDB
使用谓词锁。一个空间
索引包含最小边界矩形(MBR)值,InnoDB
执行一致读索引通过设置一个谓词锁定MBR值用于查询。其他事务不能插入或修改一行将匹配查询条件。