InnoDB next-key locking
2016-05-05 16:57
651 查看
在 InnoDB 的行级锁定上使用一个称作 next-key locking 算法。在 InnoDB 在搜索或扫描表的索引时将进行行锁,它将在所访问到的索引上设置共享或排它的锁定。因而行锁是更加精确地而又称为索引记录锁定。
InnoDB 在索引记录上设置的锁同样会影响索引记录之前的“间隙(gap)”。如果一个用户对索引记录 R 加了一个共享或排它的锁定,那其它用户将不能在 R 之前立即插入新的记录。这种间隙锁定用于防止所谓的“phantom problem”。假设需读取和锁定表
100 的子行,并更新所搜索到的记录中某些字段。
假设表
现在,假设加在索引记录上的锁定不能阻止在间隙处的插入,一个新的子记录将可能在事务处理中被插入到表中。 如果现在在事务中再次执行
在查询返回的记录集中将会有一个新的子记录。这与事务的隔离规则相违背的:一个事务必须能够顺串(run), 因而在事务处理中所读取的数据将不会发生改变。而新的 'phantom' 子记录将会打破这个隔离规则。
当 InnoDB 扫描索引时,它同样会锁定在索引中在结尾记录(the last record)之后的间隙。这仅仅在上例中会发生: InnoDB 设置的锁定将阻止任何
100 的插入。
在应用程序中可以通过一个 next-key locking 来实现一个唯一性(uniqueness)检查:如果以一个共享模式读取数据并没有发现与将要插入的数据存在重复值, 那么在读取过程中 next-key lock 将被设置在你的记录的后继者(successor)上,这将阻止其它用户在期间插入相同的记录,因而你可以安全地插入你的记录。
所以, next-key locking 可以允许你 'lock' 你的表中并不存在的记录。
InnoDB 在索引记录上设置的锁同样会影响索引记录之前的“间隙(gap)”。如果一个用户对索引记录 R 加了一个共享或排它的锁定,那其它用户将不能在 R 之前立即插入新的记录。这种间隙锁定用于防止所谓的“phantom problem”。假设需读取和锁定表
CHILD中标识符大于
100 的子行,并更新所搜索到的记录中某些字段。
SELECT * FROM CHILD WHERE ID > 100 FOR UPDATE;
假设表
CHILD中有一个索引字段
ID。我们的查询将从
ID大于100的第一条记录开始扫描索引记录。
现在,假设加在索引记录上的锁定不能阻止在间隙处的插入,一个新的子记录将可能在事务处理中被插入到表中。 如果现在在事务中再次执行
SELECT * FROM CHILD WHERE ID > 100 FOR UPDATE;
在查询返回的记录集中将会有一个新的子记录。这与事务的隔离规则相违背的:一个事务必须能够顺串(run), 因而在事务处理中所读取的数据将不会发生改变。而新的 'phantom' 子记录将会打破这个隔离规则。
当 InnoDB 扫描索引时,它同样会锁定在索引中在结尾记录(the last record)之后的间隙。这仅仅在上例中会发生: InnoDB 设置的锁定将阻止任何
ID大于
100 的插入。
在应用程序中可以通过一个 next-key locking 来实现一个唯一性(uniqueness)检查:如果以一个共享模式读取数据并没有发现与将要插入的数据存在重复值, 那么在读取过程中 next-key lock 将被设置在你的记录的后继者(successor)上,这将阻止其它用户在期间插入相同的记录,因而你可以安全地插入你的记录。
所以, next-key locking 可以允许你 'lock' 你的表中并不存在的记录。
相关文章推荐
- c#与java的区别
- NSNotificationCenter 的使用详解
- 传入两个中文地点,解析成坐标点,并且在地图上显示出它们之间的路线图
- iOS 搜索功能的实现
- Spark在美团的实践
- C语言中.h和.c文件解析(非常精彩,一起分享)
- 函数返回值含义------Linux错误代码含义/Linux Error Code
- 一个判断三角形形状的小程序
- JAVA调用WebService实例
- 最大和 -- 最大子矩阵
- java中volatile的认识
- Maven、gradle、Ant、Eclipse IDE之间的关系
- Android 混淆后在友盟中无定位错误位置 Unknown Source
- iOS之真机调试的情况下获取并查看数据库
- centos7系统/etc/resolv.conf 配置DNS客户
- Android Studio开发入门-引用jar及so文件
- 用PS制作红色金属网页模板
- Java设计模式之观察者模式
- apk版本在应用商店的管理
- Redis Essentials 读书笔记 - 第四章: Commands (Where the Wild Things Are)