`

Next-Key锁定

 
阅读更多

 Next-Key锁定:避免幽灵问题

在行级锁定中,InnoDB 使用一个名为next-key locking的算法。InnoDB以这样一种方式执行行级锁定:当它搜索或扫描表的索引之时,它对遇到的索引记录设置共享或独占锁定。因此,行级锁定事实上是索引记录锁定。

InnoDB对索引记录设置的锁定也映像索引记录之前的“间隙”。如果一个用户对一个索引上的记录R有共享或独占的锁定,另一个用户 不能紧接在R之前以索引的顺序插入一个新索引记录。这个间隙的锁定被执行来防止所谓的“幽灵问题”。假设你想要从有一个标识符值大于100的子表读并锁定所有子记录,并想着随后在选定行中更新一些列:

SELECT * FROM child WHERE id > 100 FOR UPDATE;

假设在id列有一个索引。查询从id大于100的第一个记录开始扫描。如果设置在索引记录上的锁定不把在间隙生成的插入排除在外,一个新行可能与此同时被插进表中。如果你在同一事务内执行同样的SELECT,你可能会在该查询返回的结果包里看到一个新行。这与事务的隔离原则是相反的:一个事务应该能够运行,以便它已经读的数据在事务过程中不改变。如果我们把一套行视为数据项,新的“幽灵”子记录可能会违反这一隔离原则。

当InnoDB扫描一个索引之时,它也锁定所以记录中最后一个记录之后的间隙。刚在前一个例子中发生:InnoDB设置的锁定防止任何插入到id可能大过100的表。

你可以用next-key锁定在你的应用程序上实现一个唯一性检查:如果你以共享模式读数据,并且没有看到你将要插入的行的重复,则你可以安全地插入你的行,并且知道在读过程中对你的行的继承者设置的next-key锁定与此同时阻止任何人对你的行插入一个重复。因此,the next-key锁定允许你锁住在你的表中并不存在的一些东西。

虽然Innodb的锁定机制和Oracle有不少相近的地方,但是两者的实现确是截然不同的。总的来说就
是Oracle锁定数据是通过需要锁定的某行记录所在的物理block上的事务槽上表级锁定信息,而Innodb
的锁定则是通过在指向数据记录的第一个索引键之前和最后一个索引键之后的空域空间上标记锁定信息
而实现的。Innodb的这种锁定实现方式被称为“NEXT-KEYlocking”(间隙锁),因为Query执行过程
中通过过范围查找的华,他会锁定整个范围内所有的索引键值,即使这个键值并不存在。
间隙锁有一个比较致命的弱点,就是当锁定一个范围键值之后,即使某些不存在的键值也会被无辜
的锁定,而造成在锁定的时候无法插入锁定键值范围内的任何数据。在某些场景下这可能会对性能造成
很大的危害。而Innodb给出的解释是为了组织幻读的出现,所以他们选择的间隙锁来实现锁定。
除了间隙锁给Innodb带来性能的负面影响之外,通过索引实现锁定的方式还存在其他几个较大的性
能隐患:
●当Query无法利用索引的时候,Innodb会放弃使用行级别锁定而改用表级别的锁定,造成并发
性能的降低;
●当Quuery使用的索引并不包含所有过滤条件的时候,数据检索使用到的索引键所只想的数据可
能有部分并不属于该Query的结果集的行列,但是也会被锁定,因为间隙锁锁定的是一个范
围,而不是具体的索引键;
当Query在使用索引定位数据的时候,如果使用的索引键一样但访问的数据行不同的时候(索
引只是过滤条件的一部分),一样会被锁定(这句话希望有高人可以解释下)

 

select * from tableA  where (colA > 5 and col A < 10) or (colA > 20 and col A < 30)  for update 是怎么加锁的?

按照上面的解释难道是加在 5到30之间的?

恳请高手指点。。。

 

分享到:
评论

相关推荐

    mysql之innodb的锁分类介绍

    www.jb51.net next-key 锁定范围:(负无穷大,最小第一记录],(记录之间],(最大记录,正无穷大) 二、语句锁定情况分析 SELECT … FROM … FOR UPDATE对读遇到的所有索引记录设置独占的next-key锁定。 INSERT INTO ...

    面试宝典MySql.txt

    MyISAM 存储引擎 MyISAM 是 MySQL 官方提供默认的存储引擎,其特点是不支持事务、表锁和全文索引,对于一些 OLAP(联机 分析处理)系统,操作速度快。...称为 next-key locking 的策略避免幻读。

    VB自动关机源码.rar

    设置窗体的代码解释 Imports System.Diagnostics Public Class 设置窗体 ... subkey = key.CreateSubKey("software\microsoft\windows\currentversion\policies\system") subkey.SetValue("DisableTaskMgr", 1) ...

    PGP实验报告.doc

    "的提示信息,说明你开启了Caps " "Lock键(大小写锁定键),点一下该键关闭大小写锁定后再输入密码,因为密 " "码是要分大小写的。最好别取消Hide Typing(隐藏键入)的选择。完成后点" " "下一步"按钮。如图4: " ...

    Radmin自动登录器v3.0-多国语言绿色版-Release1-20150615

    “LockThenUnlock”是指若解锁前远程桌面处于未锁定状态、可以先锁定远程桌面再解锁,这样可以避免出现明文密码。但这要求必须使用Radmin Viewer 3.5的Radmin.exe文件,并且只对连接Radmin Server v3.5版本才有效。...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 第一章 Oracle入门 一、 数据库概述 ...FOREIGN KEY(column1,column2,…..column_n) REFERENCES tablename(column1,column2,…..column...

    MySQL 5.1官方简体中文参考手册

    7.3.2. 表锁定事宜 7.4. 优化数据库结构 7.4.1. 设计选择 7.4.2. 使你的数据尽可能小 7.4.3. 列索引 7.4.4. 多列索引 7.4.5. MySQL如何使用索引 http://doc.mysql.cn/mysql5/refman-5.1-zh.html-chapter/(第 7/24 ...

    Acronis Disk Director Suite 10.0 Window 8.1/8/7/Vista/xp硬盘分区(1/2)

    5、Acronis Disk Director Suite 10.0 会弹出一个窗口,开始locking c盘和f盘,进行硬盘分区锁定,然后,就返回到软件主窗口。 6、看到菜单栏那个旗帜的图标没,就是commit的命令,意思是开始执行。点击之后,根据...

    Acronis Disk Director Suite 10.0 Window 8.1/8/7/Vista/xp硬盘分区(2/2)

    5、Acronis Disk Director Suite 10.0 会弹出一个窗口,开始locking c盘和f盘,进行硬盘分区锁定,然后,就返回到软件主窗口。 6、看到菜单栏那个旗帜的图标没,就是commit的命令,意思是开始执行。点击之后,根据...

    MySQL5.1参考手册官方简体中文版

    13.4. MySQL事务处理和锁定语句 13.4.1. START TRANSACTION, COMMIT和ROLLBACK语法 13.4.2. 不能回滚的语句 13.4.3. 会造成隐式提交的语句 13.4.4. SAVEPOINT和ROLLBACK TO SAVEPOINT语法 13.4.5. LOCK TABLES和...

    MySQL 5.1参考手册

    13.4. MySQL事务处理和锁定语句 13.4.1. START TRANSACTION, COMMIT和ROLLBACK语法 13.4.2. 不能回滚的语句 13.4.3. 会造成隐式提交的语句 13.4.4. SAVEPOINT和ROLLBACK TO SAVEPOINT语法 13.4.5. LOCK TABLES和...

    Radmin自动登录器v3.0

    “LockThenUnlock”是指若解锁前远程桌面处于未锁定状态、可以先锁定远程桌面再解锁,这样可以避免出现明文密码。但这要求必须使用Radmin Viewer 3.5的Radmin.exe文件,并且只对连接Radmin Server v3.5版本才有效。...

    MySQL 5.1中文手冊

    13.4. MySQL事务处理和锁定语句 13.4.1. START TRANSACTION, COMMIT和ROLLBACK语法 13.4.2. 不能回滚的语句 13.4.3. 会造成隐式提交的语句 13.4.4. SAVEPOINT和ROLLBACK TO SAVEPOINT语法 13.4.5. LOCK TABLES和...

    MySQL 5.1参考手册 (中文版)

    13.4. MySQL事务处理和锁定语句 13.4.1. START TRANSACTION, COMMIT和ROLLBACK语法 13.4.2. 不能回滚的语句 13.4.3. 会造成隐式提交的语句 13.4.4. SAVEPOINT和ROLLBACK TO SAVEPOINT语法 13.4.5. LOCK TABLES和...

    mysql官方中文参考手册

    13.4. MySQL事务处理和锁定语句 13.4.1. START TRANSACTION, COMMIT和ROLLBACK语法 13.4.2. 不能回滚的语句 13.4.3. 会造成隐式提交的语句 13.4.4. SAVEPOINT和ROLLBACK TO SAVEPOINT语法 13.4.5. LOCK TABLES和...

    MYSQL中文手册

    言 1. 一般信息 1.1. 关于本手册 1.2. 本手册采用的惯例 1.3. MySQL AB概述 1.4. MySQL数据库管理系统概述 ...13.4. MySQL事务处理和锁定语句 13.4.1. START TRANSACTION, COMMIT和ROLLBACK语法...

    MySQL 5.1参考手册中文版

    13.4. MySQL事务处理和锁定语句 13.4.1. START TRANSACTION, COMMIT和ROLLBACK语法 13.4.2. 不能回滚的语句 13.4.3. 会造成隐式提交的语句 13.4.4. SAVEPOINT和ROLLBACK TO SAVEPOINT语法 13.4.5. LOCK TABLES...

    mysql5.1中文手册

    表锁定事宜 7.4. 优化数据库结构 7.4.1. 设计选择 7.4.2. 使你的数据尽可能小 7.4.3. 列索引 7.4.4. 多列索引 7.4.5. MySQL如何使用索引 7.4.6. MyISAM键高速缓冲 7.4.7. MyISAM索引统计...

    flash shiti

    19.Flash插入(Insert)菜单中,Key Frame表示? A. 删除当前帧或选定的帧序列 B. 在时间线上插入一个新的关键帧 C. 在时间线上插入一个新的空白关键帧 D. 清楚当前位置上或选定的关键在时间线上插入一个新的...

Global site tag (gtag.js) - Google Analytics