14.5.4 Phantom Rows 幻影行
14.5.4 Phantom Rows 幻影行 所谓的幻读问题发生在一个事务 当相同的查询产生不同的结果集在不同的时间。 例如,如果一个SELECT 是执行2次,但是第2次返回的时间不第一次返回不同,行是变换的记录。 假设有一个索引是在child 表的id 列,需要读和锁定表的所有的记录 Id值大于100, 以便更新选择的记录的列 SELECT * FROM child WHERE id > 100 FOR UPDATE; 查询扫描 索引开始从第一个记录 id 是大于100.表包含记录id只有90和102. 如果锁设置在index records 在扫描的范围 不锁定插入到整个gaps(在这种情况下, gap是90到102) 另外的会话可以插入一个新值到表 id值为101. 如果你执行相同的SELECT 在相同的事务,你可能会看到一个新的激励 id值为101(一个幻读) 如果 我们注意 数据集为一个数据项,新的幻读child 会违反事务的隔离原则 以便在事务期间读取到的数据不会改变 CREATE TABLE `child` (
`sn` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增编号',
`id` int(16) NOT NULL,
`channelType` int(11) DEFAULT NULL COMMENT '通道识别',
`status` tinyint(4) NOT NULL COMMENT '短信转态,1.发送成功,2.发送失败,3.发送异常',
PRIMARY KEY (`sn`)
) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8 COMMENT='短信发送成功记录表'; | 82 | 82 | 2 | 1 |
| 83 | 83 | 2 | 1 |
| 84 | 84 | 2 | 1 |
| 85 | 85 | 2 | 1 |
| 86 | 86 | 2 | 1 |
| 87 | 87 | 2 | 1 |
| 88 | 88 | 2 | 1 |
| 89 | 89 | 2 | 1 |
| 90 | 90 | 2 | 1 |
| 102 | 102 | 2 | 1 |
| 103 | 103 | 2 | 1 |
| 104 | 104 | 2 | 1 mysql> create index child_idx1 on child(id);
Query OK, 0 rows affected (0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0 Create Table: CREATE TABLE `child` (
`sn` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增编号',
`id` int(16) NOT NULL,
`channelType` int(11) DEFAULT NULL COMMENT '通道识别',
`status` tinyint(4) NOT NULL COMMENT '短信转态,1.发送成功,2.发送失败,3.发送异常',
PRIMARY KEY (`sn`),
KEY `child_idx1` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=150 DEFAULT CHARSET=utf8 COMMENT='短信发送成功记录表'
1 row in set (0.00 sec) Session 1: mysql> start transaction;
Query OK, 0 rows affected (0.00 sec) mysql> SELECT * FROM child WHERE id > 100 FOR UPDATE;
+-----+-----+-------------+--------+
| sn | id | channelType | status |
+-----+-----+-------------+--------+
| 120 | 120 | 2 | 1 |
| 121 | 121 | 2 | 1 | Session 2: 此时的区间为[90,无穷) 这个区间记录都无法插入
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec) mysql> insert into zjzc.child(id,channelType,status) values(1,1,1);
Query OK, 1 row affected (0.00 sec) mysql> insert into zjzc.child(id,channelType,status) values(80,1,1);
Query OK, 1 row affected (0.00 sec) mysql> insert into zjzc.child(id,channelType,status) values(85,1,1);
Query OK, 1 row affected (0.00 sec) mysql> insert into zjzc.child(id,channelType,status) values(87,1,1);
Query OK, 1 row affected (0.00 sec) mysql> insert into zjzc.child(id,channelType,status) values(88,1,1);
Query OK, 1 row affected (0.00 sec) mysql> insert into zjzc.child(id,channelType,status) values(89,1,1);
Query OK, 1 row affected (0.00 sec) mysql> insert into zjzc.child(id,channelType,status) values(90,1,1); --hang mysql> insert into zjzc.child(id,channelType,status) values(90,1,1); ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
mysql>
mysql> insert into zjzc.child(id,channelType,status) values(91,1,1);
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction mysql> insert into zjzc.child(id,channelType,status) values(101,1,1);
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction mysql> insert into zjzc.child(id,channelType,status) values(102,1,1);--hang mysql> insert into zjzc.child(id,channelType,status) values(103,1,1);
^CCtrl-C -- sending "KILL QUERY 2" to server ...
Ctrl-C -- query aborted.
^[[AERROR 1317 (70100): Query execution was interrupted
mysql> insert into zjzc.child(id,channelType,status) values(99999999,1,1); 全部锁住 为了防止幻读, InnoDB 使用一个算法叫做 next-key locking 组合了 index-row lock和gap lock. InnoDB 执行 row-level locking 以这样的方式 当他搜索或者扫描一个索引的时候, 它设置 共享或者排他锁 在遇到的index records上。因此, row-level locks are actually index-record locks. 此外,, a next-key lock 在一个Index record 也被称为"gap" 在那个index record 之前。 也就是说,一个next-key lock 是一个index-record lock加上一个区间锁 在index record之前的区间 如果一个session 有一个共享的或者排他的锁在记录R上在一个索引里, 另外的session 不能插入一个新的index 记录在这个区间 在记录R之前 当InnoDB 扫描一个索引,他也会锁定区间在最后的记录后面 就像前面的例子,为了阻止任何插入到表 id值是大于100 , 你可以使用 next-key locking来实现一个唯一性检查在你的应用里, 如果你读取你的数据在共享模式,不想看到重复对于一个你想要插入的记录, 然后呢可以安全的插入你的记录和知道 next-key lock 设置
14.5.4 Phantom Rows 幻影行的更多相关文章
- 14.3.4 Phantom Rows 幻影行
14.3.4 Phantom Rows 幻影行 所谓的幻读为发生在一个事务 当相同的查询产生不同的结果集在不同的时间. 比如,如果一个SELECT被执行2次, 但是第2次返回的记录不是第一次返回的记录 ...
- InnoDB 存储引擎的锁机制
测试环境隔离级别:REPEATABLE-READ 行级别的 - Share and Exclusive Locks 共享锁 S:允许持有S锁的事务对行进行读操作 排他锁 X: 允许持有X锁的事务对行进 ...
- 【原创】新说Mysql事务隔离级别
引言 大家在面试中一定碰到过 说说事务的隔离级别吧? 老实说,事务隔离级别这个问题,无论是校招还是社招,面试官都爱问!然而目前网上很多文章,说句实在话啊,我看了后我都怀疑作者弄懂没!因为他们对可重复读 ...
- [51CTO]新说MySQL事务隔离级别!
新说MySQL事务隔离级别! 事务隔离级别这个问题,无论是校招还是社招,面试官都爱问!然而目前网上很多文章,说句实在话啊,我看了后我都怀疑作者弄懂没!本文所讲大部分内容,皆有官网作为佐证,因此对本文内 ...
- 【转】新说Mysql事务隔离级别
作者:孤独烟 转自:https://www.cnblogs.com/rjzheng/p/9955395.html 引言 大家在面试中一定碰到过 说说事务的隔离级别吧? 老实说,事务隔离级别这个问题,无 ...
- Shared and Exclusive Locks 共享和排它锁
14.5 InnoDB Locking and Transaction Model InnoDB 锁和事务模型 14.5.1 InnoDB Locking 14.5.2 InnoDB Transact ...
- mysql 锁2
官网地址 https://dev.mysql.com/doc/refman/5.5/en/innodb-transaction-isolation-levels.html 这里主要是说事务隔离级别,以 ...
- [MySQL Reference Manual]14 InnoDB存储引擎
14 InnoDB存储引擎 14 InnoDB存储引擎 14.1 InnoDB说明 14.1.1 InnoDB作为默认存储引擎 14.1.1.1 存储引擎的趋势 14.1.1.2 InnoDB变成默认 ...
- Mysql事务及行级锁的理解
在最近的开发中,碰到一个需求签到,每个用户每天只能签到一次,那么怎么去判断某个用户当天是否签到呢?因为当属表设计的时候,每个用户签到一次,即向表中插入一条记录,根据记录的数量和时间来判断用户当天是否签 ...
随机推荐
- vs2010 Express 下载连接
记录: vs2010 Express 下载连接 正式下载链接: http://download.microsoft.com/download/5/C/1/5C156922-CA10-49D8-B7E ...
- Crawler & Ajax:WebBrowser C#
Crawler 與 Ajax http://net.zdnet.com.cn/network_security_zone/2007/1005/536329.shtml WebBrowser: 利用We ...
- web前端:html
一.理解表单的作用 1.web 应用程序不仅仅是给用户显示数据,还应该给用户提供一个可以输入数据的图形用户界面.表单的主要作用在于在网页上提供一个图形用户界面,已采集和提交用户输入的数据. 2.htm ...
- couchbase failover 集群故障自动转移方案研究!
最近迷上Couchbase了,现在所有的站点全部试用Couchbase进行缓存及持久化,这样以来貌似风险比较大啊,缓存服务器挂了就完了. 看到有讲到Couchbase的集群方案很简单,于是照着教程做了 ...
- java 文件和流
最近工作中涉及到一些文件操作的东西,闲下来刚好做个整理. 控制台IO 在控制台使用键盘作为标准输入并使用终端窗口(在windows下,经常是命令提示符或者是PowerShell:在linuxx/OS ...
- TUXEDO管理命令总结
tmboot 启动服务: 参数说明: -l lmid 启动逻辑服务器名为lmcd服务器上的所有进程 -g grpname 启动GROUP名为grpname的所有进程 -i srvid 启动SRV ...
- oracle插入数据报错ORA-26026
今天进行数据清理时发现报错ORA-26026,主要是把从交易库提取数据并插入到归档库中. 检查一下发现是归档库的索引问题. 当时为了提高插入速度,所以删除了归档库的索引,可能对主键索引产生了影响. 解 ...
- 推送消息实现icon角标的动态显示
在你自己服务器上做计数,客户端做减法并反馈给你的服务器 ,然后你服务器将需要显示的数字发送给苹果推送服务器(就是消息中的badge)比如:1,你服务器上发送出去3个推送消息到A手机 ...
- 【html】【6】div浮动float
我想 当看完上面的必看链接,拥有一定的基础后也得7天左右, 记住 一定要看完,知道它都有什么,没学会不要紧,哪怕只是有个简单的概念也行, 随着后续的使用慢慢深入学习,现在开始div布局. 必看参考: ...
- STP根交换机,指定端口,根端口,阻塞端口
STP判断各交换机端口(指定端口:DP;根端口:RP;阻塞端口:AP) 判断步骤: 1.选举根交换机: 判断对象:所有运行STP协议的交换机中选出一个; 判断依据:交换机中选择网桥ID值(交换机优先级 ...