对于唯一索引使用唯一条件搜索, InnoDB 只锁定找到的index record,不是它之前的区间
| test100 | CREATE TABLE `test100` (
`sn` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增编号',
`phoneNo` int(11) DEFAULT NULL,
`channelType` int(11) DEFAULT NULL COMMENT '通道识别',
`status` tinyint(4) NOT NULL COMMENT '短信转态,1.发送成功,2.发送失败,3.发送异常',
PRIMARY KEY (`sn`),
UNIQUE KEY `test100_idx1` (`phoneNo`) Session 1: mysql> select * from test100 where phoneNo between 10 and 20 for update;
+----+---------+-------------+--------+
| sn | phoneNo | channelType | status |
+----+---------+-------------+--------+
| 10 | 10 | 2 | 1 |
| 11 | 11 | 2 | 1 |
| 16 | 16 | 2 | 1 |
| 17 | 17 | 2 | 1 |
| 18 | 18 | 2 | 1 |
| 19 | 19 | 2 | 1 |
| 20 | 20 | 2 | 1 |
+----+---------+-------------+--------+
7 rows in set (0.00 sec) mysql> rollback;
Query OK, 0 rows affected (0.00 sec) mysql> start transaction;
Query OK, 0 rows affected (0.00 sec) mysql> select * from test100 where phoneNo=16 for update;
+----+---------+-------------+--------+
| sn | phoneNo | channelType | status |
+----+---------+-------------+--------+
| 16 | 16 | 2 | 1 |
+----+---------+-------------+--------+
1 row in set (0.00 sec) Session 2: mysql> insert into zjzc.test100(PhoneNo,channelType,status) values(15,1,1);
Query OK, 1 row affected (0.01 sec) mysql> insert into zjzc.test100(PhoneNo,channelType,status) values(14,1,1);
Query OK, 1 row affected (0.01 sec) mysql> insert into zjzc.test100(PhoneNo,channelType,status) values(17,1,1);
ERROR 1062 (23000): Duplicate entry '17' for key 'test100_idx1'
mysql> 此时RR模式下唯一索引 可以插入 /****************************************************************
mysql> select * from test100 where phoneNo<20;
+----+---------+-------------+--------+
| sn | phoneNo | channelType | status |
+----+---------+-------------+--------+
| 1 | 1 | 2 | 1 |
| 2 | 2 | 2 | 1 |
| 3 | 3 | 2 | 1 |
| 4 | 4 | 2 | 1 |
| 5 | 5 | 2 | 1 |
| 6 | 6 | 2 | 1 |
| 7 | 7 | 2 | 1 |
| 8 | 8 | 2 | 1 |
| 9 | 9 | 2 | 1 |
| 10 | 10 | 2 | 1 |
| 11 | 11 | 2 | 1 |
| 16 | 16 | 2 | 1 |
| 17 | 17 | 2 | 1 |
| 18 | 18 | 2 | 1 |
| 19 | 19 | 2 | 1 |
+----+---------+-------------+--------+
15 rows in set (0.00 sec) 测试非唯一索引情况下: | test100 | CREATE TABLE `test100` (
`sn` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增编号',
`phoneNo` int(11) DEFAULT NULL,
`channelType` int(11) DEFAULT NULL COMMENT '通道识别',
`status` tinyint(4) NOT NULL COMMENT '短信转态,1.发送成功,2.发送失败,3.发送异常',
PRIMARY KEY (`sn`),
KEY `test100_idx1` (`phoneNo`)
) ENGINE=InnoDB AUTO_INCREMENT=5023 DEFAULT CHARSET=utf8 COMMENT='短信发送成功记录表' Session 1:
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec) mysql> select * from test100 where phoneNo=16 for update;
+----+---------+-------------+--------+
| sn | phoneNo | channelType | status |
+----+---------+-------------+--------+
| 16 | 16 | 2 | 1 |
+----+---------+-------------+--------+
1 row in set (0.00 sec) Session 2:
mysql> insert into zjzc.test100(PhoneNo,channelType,status) values(14,1,1); --hang mysql> insert into zjzc.test100(PhoneNo,channelType,status) values(13,1,1); -hang mysql> insert into zjzc.test100(PhoneNo,channelType,status) values(15,1,1); -hang mysql> insert into zjzc.test100(PhoneNo,channelType,status) values(16,1,1); -hang
mysql> insert into zjzc.test100(PhoneNo,channelType,status) values(17,1,1);
Query OK, 1 row affected (0.01 sec) 结论: For a unique index with a unique search condition, InnoDB locks only the index record found, not the gap before it. 对于唯一索引使用唯一条件搜索, InnoDB 只锁定找到的index record,不是它之前的区间 For other search conditions, InnoDB locks the index range scanned, using gap locks or next-key locks to block insertions by other sessions into the gaps covered by the range. 对于其他搜索条件, InnoDB 扫描的索引范围,使用gap lock or next-key locks 来堵塞其他会话插入这个区间 区间锁: 一个区间锁 是一个锁在index记录之间的区间,或者一个锁在第一个或者最后一个index记录的区间 比如,SELECT c1 FOR UPDATE FROM t WHERE c1 BETWEEN 10 and 20; 组织其他事务插入值为15到t.c1列,不管是否这里已经有这些的值存储, 因为区间锁是在所有存在的值在这个范围被锁定 一个区间锁扩约一个单独的索引值,多个索引值,甚至是空的 区间锁是权衡并发和性能的一部分, 用于一些事务隔离而不是其他 Gap 锁定不能用于语句 ,锁定记录使用一个unique index来搜索用于一个唯一的记录 (这个不能包含例子 搜索条件只包含多列唯一索引的一些列,在那种情况下,gap locking 也存在) 比如, 如果Id列有一个唯一索引,下面语句只用一个index-record锁用于记录id值为100 它不管是否其他灰灰插入记录到前面的区间 SELECT * FROM child WHERE id = 100; 如果id没有被索引或者有一个非唯一索引,语句会锁前面的区间 在InnoDB中Gap locks 是"纯粹抑制的", 这意味着它们只能停止其他事务防止插入到这个区间。 它们不阻止不同的事务来利用区间锁在相同的区间 区间锁可以被显示禁用, 这个发生如果你改变的事务隔离为 READ COMMITTED 或者启用了innodb_locks_unsafe_for_binlog 在这群情况下, 区间锁是被禁用的用于搜索和索引扫描
对于唯一索引使用唯一条件搜索, InnoDB 只锁定找到的index record,不是它之前的区间的更多相关文章
- 如何选择普通索引和唯一索引《死磕MySQL系列 五》
系列文章 一.原来一条select语句在MySQL是这样执行的<死磕MySQL系列 一> 二.一生挚友redo log.binlog<死磕MySQL系列 二> 三.MySQL强 ...
- SQL Server索引 - 聚集索引、非聚集索引、非聚集唯一索引 <第八篇>
聚集索引.非聚集索引.非聚集唯一索引 我们都知道建立适当的索引能够提高查询速度,优化查询.先说明一下,无论是聚集索引还是非聚集索引都是B树结构. 聚集索引默认与主键相匹配,在设置主键时,SQL Ser ...
- MySQL 普通索引、唯一索引和主索引
1.普通索引 普通索引(由关键字KEY或INDEX定义的索引)的唯一任务是加快对数据的访问速度.因此,应该只为那些最经常出现在查询条件(WHEREcolumn=)或排序条件(ORDERBYcolumn ...
- Constraint1:主键约束,唯一性约束和唯一索引
1,主键约束创建索引 作为Primay Key的列是唯一的,非空的,Sql Server在创建主键约束时,自动为主键列创建一个唯一索引,并且索引列不允许为null. create table dbo. ...
- SQL Server索引进阶:第八级,唯一索引
原文地址: Stairway to SQL Server Indexes: Level 8,Unique Indexes 本文是SQL Server索引进阶系列(Stairway to SQL Ser ...
- 【译】索引进阶(八):SQL SERVER唯一索引
[译注:此文为翻译,由于本人水平所限,疏漏在所难免,欢迎探讨指正] 原文链接:传送门. 在本章节我们检查唯一索引.唯一索引的特别之处在于它不仅提供了性能益处,而且提供了数据完整性益处.在SQL SER ...
- mysql创建唯一索引,避免数据重复插入
多台服务器使用一个数据库时,有时就会出现重复插入的情况,eg:people表中的姓名和身份证号 此时可以给姓名和身份证号创建唯一索引, 创建语句:alter table people add uniq ...
- 使用SQL创建唯一索引
使用sql语句创建唯一索引,格式如下: create unique index 索引名 on 表名(列名1,列名2……) 示例:在表GoodsMade_Labour的SID列上创建唯一索引IX_Goo ...
- 唯一索引的一种使用情景【有则U无则I】
这个知识点是最近一位面试老师问我的,当时对这种方法不了解,所以只能说那个中效率低的方法了,也就是先进性select判断,然后在执行更新或者插入操作,显然这种是很麻烦的,也自我反思一下,确实有很多的知识 ...
随机推荐
- Qt 学习之路:线程和 QObject
前面两个章节我们从事件循环和线程类库两个角度阐述有关线程的问题.本章我们将深入线程间得交互,探讨线程和QObject之间的关系.在某种程度上,这才是多线程编程真正需要注意的问题. 现在我们已经讨论过事 ...
- Objective-C中的@Property详解
Objective-C中的@Property详解 @Property (属性) class vairs 这个属性有nonatomic, strong, weak, retain, copy等等 我把它 ...
- media query
accepted Another useful media feature is device-aspect-ratio. Note that the iPhone 5 does not have a ...
- Topcoder SRM 661 (Div.1) 250 MissingLCM - 数论
[题意] 给你一个数N(1<=N<=10^6),要求最小的M(M>N),使得lcm(n+1,n+2,...m)=lcm(1,2,3,...,m) [思路] 手速太慢啦,等敲完代码的时 ...
- 9.23 noip模拟试题
Problem 1 抓牛(catchcow.cpp/c/pas) [题目描述] 农夫约翰被通知,他的一只奶牛逃逸了!所以他决定,马上出发,尽快把那只奶牛抓回来. 他们都站在数轴上.约翰在N(O≤N ...
- 设计模式学习——准备(UML类图)
前言 其实吧,最早接触UML是源于软件设计师的考试,半路出家实在难为我了.学设计模式总是要画类图的,所以补充UML的类图的知识是很重要滴.第一篇就偷懒一点copy别人的东西了.实话说,我们都是踩在巨人 ...
- CSS3伪类nth-child结合transiton动画实现文字若影若现
css3伪类nth-child结合transiton动画实现文字若影若现收先创建一个div盒子,然后包裹在div中的有10个span标签每个span标签填上内容一次为A,B,C,D,E,F,G,H,I ...
- Html网页生成Pdf
在http://code.google.com/p/wkhtmltopdf/downloads/list下载安装程序. 1.添加引用 using System.Diagnostics; 添加引用 2. ...
- PHP 进行统一邮箱登陆的代理实现(swoole)
在工作的过程中,经常会有很多应用有发邮件的需求,这个时候需要在每个应用中配置smtp服务器.一旦公司调整了smtp服务器的配置,比如修改了密码等,这个时候对于维护的人员来说要逐一修改应用中smtp的配 ...
- IIS部署.NET项目的有关事项_2015.07.02
今天在做项目中的关于发送邮件的一些功能.在部署服务的时候遇到了一些奇葩的问题,基本上是和IIS有关的问题. 首先,项目是基于.NET Framework4.0 版本的,由于本人用的是一台新配置好的机器 ...