| 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,不是它之前的区间的更多相关文章

  1. 如何选择普通索引和唯一索引《死磕MySQL系列 五》

    系列文章 一.原来一条select语句在MySQL是这样执行的<死磕MySQL系列 一> 二.一生挚友redo log.binlog<死磕MySQL系列 二> 三.MySQL强 ...

  2. SQL Server索引 - 聚集索引、非聚集索引、非聚集唯一索引 <第八篇>

    聚集索引.非聚集索引.非聚集唯一索引 我们都知道建立适当的索引能够提高查询速度,优化查询.先说明一下,无论是聚集索引还是非聚集索引都是B树结构. 聚集索引默认与主键相匹配,在设置主键时,SQL Ser ...

  3. MySQL 普通索引、唯一索引和主索引

    1.普通索引 普通索引(由关键字KEY或INDEX定义的索引)的唯一任务是加快对数据的访问速度.因此,应该只为那些最经常出现在查询条件(WHEREcolumn=)或排序条件(ORDERBYcolumn ...

  4. Constraint1:主键约束,唯一性约束和唯一索引

    1,主键约束创建索引 作为Primay Key的列是唯一的,非空的,Sql Server在创建主键约束时,自动为主键列创建一个唯一索引,并且索引列不允许为null. create table dbo. ...

  5. SQL Server索引进阶:第八级,唯一索引

    原文地址: Stairway to SQL Server Indexes: Level 8,Unique Indexes 本文是SQL Server索引进阶系列(Stairway to SQL Ser ...

  6. 【译】索引进阶(八):SQL SERVER唯一索引

    [译注:此文为翻译,由于本人水平所限,疏漏在所难免,欢迎探讨指正] 原文链接:传送门. 在本章节我们检查唯一索引.唯一索引的特别之处在于它不仅提供了性能益处,而且提供了数据完整性益处.在SQL SER ...

  7. mysql创建唯一索引,避免数据重复插入

    多台服务器使用一个数据库时,有时就会出现重复插入的情况,eg:people表中的姓名和身份证号 此时可以给姓名和身份证号创建唯一索引, 创建语句:alter table people add uniq ...

  8. 使用SQL创建唯一索引

    使用sql语句创建唯一索引,格式如下: create unique index 索引名 on 表名(列名1,列名2……) 示例:在表GoodsMade_Labour的SID列上创建唯一索引IX_Goo ...

  9. 唯一索引的一种使用情景【有则U无则I】

    这个知识点是最近一位面试老师问我的,当时对这种方法不了解,所以只能说那个中效率低的方法了,也就是先进性select判断,然后在执行更新或者插入操作,显然这种是很麻烦的,也自我反思一下,确实有很多的知识 ...

随机推荐

  1. iOS-UITouch,UIEvent使用介绍

    UITouch 当用户用一根手指触摸屏幕时,会创建一个与手指相关联的UITouch对象 一根手指对应一个UITouch对象 UITouch的作用 保存着跟手指相关的信息,比如触摸的位置.时间.阶段 当 ...

  2. iOS--为视图添加阴影

    iOS–为视图添加阴影 情况一:视图添加圆角,在添加阴影 //阴影视图 self.viewShadow = [[UIView alloc]initWithFrame:CGRectMake(0, 0, ...

  3. 亲测安装php

    亲测安装php1.tar zvxf php-5.3.8.tar.gz 2.cd php-5.3.83../configure \ --prefix=/usr/local/php \--with-mys ...

  4. Service 如何知道caller

    重写Binder的onTransact方法 1   you need to do that in Binder#onTransact method, this is a good place for ...

  5. 使用AVCaptureSession捕捉视频

    #import <UIKit/UIKit.h> #import <AVFoundation/AVFoundation.h> #import <AssetsLibrary/ ...

  6. JDK5-增强for循环

    下面的程序演示了增强for循环在数组及集合中的应用: import java.util.ArrayList; import java.util.HashMap; import java.util.Ha ...

  7. Configuring Robolectric

    There are numerous ways to customize how Robolectric behaves at runtime. Config Annotation The prima ...

  8. linux设置语言编码

    前段时间在服务器上安装了centos6.2版本,当初安装时语言选择英文.这本来也没有什么问题,直到前一段时间.我的同事发现部署的web项目中出现乱码情况.但中文作为参数进行传递到下一个页面的时候就乱码 ...

  9. hadoop集群环境搭建之zookeeper集群的安装部署

    关于hadoop集群搭建有一些准备工作要做,具体请参照hadoop集群环境搭建准备工作 (我成功的按照这个步骤部署成功了,经实际验证,该方法可行) 一.安装zookeeper 1 将zookeeper ...

  10. 关于封装的一个小问题和TA的例子

    写个小例子吧 --  很多细节(如校验.判断等等)都略了 其实不是有意写成这样,而是很多朋友都这么写(当然里面也有点夸张的写法) 这么写其实也没什么不好,简单明了,不用动脑子,一看就很直白, 但是如果 ...