博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
InnoDB Record, Gap, and Next-Key Locks
阅读量:6652 次
发布时间:2019-06-25

本文共 5221 字,大约阅读时间需要 17 分钟。

hot3.png

InnoDB Record, Gap, and Next-Key Locks

InnoDB has several types of record-level locks including record locks, gap locks, and next-key locks. 

For information about shared locks, exclusive locks, and intention locks, see Section 14.2.2.1, “InnoDB Lock Modes”.

Record lock: This is a lock on an index record.

Gap lock: This is a lock on a gap between index records, or a lock on the gap before the first or after the last index record.

Next-key lock: This is a combination of a record lock on the index record and a gap lock on the gap before the index record.

Record Locks

Record locks always lock index records, even if a table is defined with no indexes. For such cases, InnoDB creates a hidden clustered index and uses this index for record locking. See Section 14.2.7.2, “Clustered and Secondary Indexes”.

Next-key Locks

By default, InnoDB operates in REPEATABLE READ transaction isolation level. In this case, InnoDB uses next-key locks for searches and index scans, which prevents phantom rows (see Section 14.2.2.5, “Avoiding the Phantom Problem Using Next-Key Locking”).

Next-key locking combines index-row locking with gap locking. InnoDB performs row-level locking in such a way that when it searches or scans a table index, it sets shared or exclusive locks on the index records it encounters. Thus, the row-level locks are actually index-record locks. In addition, a next-key lock on an index record also affects the “gap” before that index record. That is, a next-key lock is an index-record lock plus a gap lock on the gap preceding the index record. If one session has a shared or exclusive lock on record R in an index, another session cannot insert a new index record in the gap immediately before R in the index order.

Suppose that an index contains the values 10, 11, 13, and 20. The possible next-key locks for this index cover the following intervals, where ( or ) denote exclusion of the interval endpoint and [ or ] denote inclusion of the endpoint:

(negative infinity, 10]

(10, 11]

(11, 13]

(13, 20]

(20, positive infinity)

For the last interval, the next-key lock locks the gap above the largest value in the index and the “supremum” pseudo-record having a value higher than any value actually in the index. The supremum is not a real index record, so, in effect, this next-key lock locks only the gap following the largest index value.

Gap Locks

The next-key locking example in the previous section shows that a gap might span a single index value, multiple index values, or even be empty.

Gap locking is not needed for statements that lock rows using a unique index to search for a unique row. (This does not include the case that the search condition includes only some columns of a multiple-column unique index; in that case, gap locking does occur.) For example, if the id column has a unique index, the following statement uses only an index-record lock for the row having id value 100 and it does not matter whether other sessions insert rows in the preceding gap:

SELECT * FROM child WHERE id = 100;

If id is not indexed or has a nonunique index, the statement does lock the preceding gap.

A type of gap lock called an insert intention gap lock is set by INSERT operations prior to row insertion. This lock signals the intent to insert in such a way that multiple transactions inserting into the same index gap need not wait for each other if they are not inserting at the same position within the gap. Suppose that there are index records with values of 4 and 7. Separate transactions that attempt to insert values of 5 and 6 each lock the gap between 4 and 7 with insert intention locks prior to obtaining the exclusive lock on the inserted row, but do not block each other because the rows are nonconflicting.

It is also worth noting here that conflicting locks can be held on a gap by different transactions. For example, transaction A can hold a shared gap lock (gap S-lock) on a gap while transaction B holds an exclusive gap lock (gap X-lock) on the same gap. The reason conflicting gap locks are allowed is that if a record is purged from an index, the gap locks held on the record by different transactions must be merged.

Gap locks in InnoDB are “purely inhibitive”, which means they only stop other transactions from inserting to the gap. Thus, a gap X-lock has the same effect as a gap S-lock.

Disabling Gap Locking

Gap locking can be disabled explicitly. This occurs if you change the transaction isolation level to READ COMMITTED or enable the innodb_locks_unsafe_for_binlog system variable (which is now deprecated). Under these circumstances, gap locking is disabled for searches and index scans and is used only for foreign-key constraint checking and duplicate-key checking.

There are also other effects of using the READ COMMITTED isolation level or enabling innodb_locks_unsafe_for_binlog: Record locks for nonmatching rows are released after MySQL has evaluated the WHERE condition. For UPDATE statements, InnoDB does a “semi-consistent” read, such that it returns the latest committed version to MySQL so that MySQL can determine whether the row matches the WHERE condition of the UPDATE.

============END============

转载于:https://my.oschina.net/xinxingegeya/blog/530149

你可能感兴趣的文章
多台Mac电脑使用同一个apple开发者账号测试
查看>>
区块链发行币说明参考
查看>>
图解git中的最常用命令
查看>>
Expo大作战(七)--expo如何使用Genymotion模拟器
查看>>
[svc]linux文件权限
查看>>
R绘图 第一篇:ggplot2绘图
查看>>
关于使用maven打包如何聚合资源文件
查看>>
互联网项目从产品设计到上线的过程是怎么样的?
查看>>
浮动、定位
查看>>
php解析mpp文件中的前置任务
查看>>
PyTorch为何如此高效好用?
查看>>
[ES6] Proxy & Reflect
查看>>
关于Go,你可能不注意的7件事
查看>>
图片合并成PDF,两个PDF的合并
查看>>
html input type=file 选择图片,图片预览 纯html js实现图片预览
查看>>
相机上的P,S,A,M分别是什么单词的缩写?
查看>>
杭州电子科技大学2018年自命题科目考试大纲(数据结构与组成原理)
查看>>
django 的缩略图sorl-thumbnail的使用连接地址
查看>>
WPF:如何为程序添加splashScreen?
查看>>
用js生成PDF的方案
查看>>