【MySQL】可重複讀下的幻讀

楊奇龍發表於2012-12-08
【背景】
在研究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 已經解決了幻讀問題。對於本實驗如有不妥,望各位看官不吝賜教。
【參考】

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22664653/viewspace-750795/,如需轉載,請註明出處,否則將追究法律責任。

相關文章