[分享]mysql可重复读下的幻读 _MySQL, Oracle及数据库讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  MySQL, Oracle及数据库讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 1935 | 回复: 0   主题: [分享]mysql可重复读下的幻读         下一篇 
DJYang
注册用户
等级:列兵
经验:91
发帖:67
精华:0
注册:2011-8-8
状态:离线
发送短消息息给DJYang 加好友    发送短消息息给DJYang 发消息
发表于: IP:您无权察看 2014-12-30 11:16:02 | [全部帖] [楼主帖] 楼主

【背景】
在研究gap lock的时候,参考了一篇文章http://www.mysqlperformanceblog.com/2012/03/27/innodbs-gap-locks/按照文章的实验来进行测试并不会出现幻读。
【概念】
幻读(Phantom Read) 是指当用户读取某一范围的数据行时,B事务在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影”行。InnoDB和Falcon存储引擎通 过多版本并发控制机制解决了幻读问题。
【验证】
做一个小的测试来验证 innodb在可重复读隔离级别上面不会出现幻读。
实验版本

root@127.0.0.1 : yang 19:49:51>  select version();
+------------+
| version()  |
+------------+
| 5.5.18-log |
+------------+
1 row in set (0.00 sec)


两个会话都是 REPEATABLE-READ 事务隔离级别

root@127.0.0.1 : yang 19:56:11> select @@tx_isolation;
+-----------------+
| @@tx_isolation  |
+-----------------+
| REPEATABLE-READ |
+-----------------+
1 row in set (0.00 sec)


且在操作的是两个会话要打开事务,start transaction

session1 20:22:05> insert into gap values (11);--未提交。
Query OK, 1 row affected (0.00 sec)
--会话2 查看无id=11的记录,不允许脏读!
session2 20:22:26> select * from gap where id>9;
+------+
| id   |
+------+
|   12 |
|   13 |
|   15 |
|   17 |
|   20 |
|   33 |
|   39 |
|   42 |
|   43 |
+------+
9 rows in set (0.00 sec)


会话1 提交

session1 20:22:21> commit;
Query OK, 0 rows affected (0.00 sec)


会话2 依然查看不到id=1的记录!

session2 20:22:32> select * from gap where id>9;
+------+
| id   |
+------+
|   12 |
|   13 |
|   15 |
|   17 |
|   20 |
|   33 |
|   39 |
|   42 |
|   43 |
+------+
9 rows in set (0.00 sec)


从本例来看 innodb 已经解决了幻读问题。对于本实验如有不妥,望各位看官不吝赐教。

--转自 北京联动北方科技有限公司




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论