| 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. 四种数据持久化方式(下) :SQLite3 和 Core Data

    在上文,我们介绍了iOS开发中的其中2种数据持久化方式:属性列表.归档解档. 本节将继续介绍另外2种iOS持久化数据的方法:数据库 SQLite3.Core Data 的运用: 在本节,将通过对4个文 ...

  2. 后端接收不到AngularJs中$http.post发送的数据的问题

    1.问题: 后端接收不到AngularJs中$http.post发送的数据,总是显示为null 示例代码: $http.post(/admin/KeyValue/GetListByPage, { pa ...

  3. 上传文件时 ContentType 浏览器差异

    上传图片时,ie会把 jpg.jpeg翻译成image/pjpeg,png翻译成image/x-png . 火狐.chrome则很标准:jpg.jpeg翻译成image/jpeg,png翻译成imag ...

  4. Bash关闭输出(关闭正确、错误输出)

    利用&>重定向,不输出任何内容: echo hello &> /dev/null 关闭正确输出: echo hello 1> /dev/null 关闭错误输出: ec ...

  5. 浅谈inline-block

    一.区分block,inline,inline-block 1.block block元素会独占一行,多个block元素会各自新起一行.默认情况下,block元素宽度自动填满其父元素宽度. block ...

  6. 关于get和set访问器以及属性和字段变量的区别问题

    属性是对一个或者多个字段的封装.      类里面为什么要用一个共有的属性来封装其中的字段,也可以这样说用共有属性来封装私有变量,其中的好处应该大家都说的出来,就是为了实现数据的封装和保证了数据的安全 ...

  7. cookie防篡改

    概述: 除了 session 外,一般不会在客户端的 cookies 里保存过于重要的凭据,但电商应用有时候不可避免地存储了一些敏感数据到客户端,当然不希望被篡改. 目的: 让服务器端能识别cooki ...

  8. HTML页面中启用360浏览器极速模式

    今天做页面突然遇到浏览器一直在兼容模式下运行,体验不好,通过查询文档,在<head>中加入<meta name="renderer" content=" ...

  9. jQuery慢慢啃之核心(一)

    1. $("div > p"); div 元素的所有p子元素. $(document.body).css( "background", "bla ...

  10. php里 \r\n换行问题

    <?php echo "hello"; echo "\r\n"; echo "world"; ?> 在浏览器输出的是hello ...