【MySQL】可重複讀下的幻讀
【背景】
在研究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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL的可重複讀級別能解決幻讀嗎MySql
- 髒讀,幻讀,不可重複讀
- 【Mysql】資料庫事務,髒讀、幻讀、不可重複讀MySql資料庫
- 髒讀、不可重複讀、幻讀區別
- 【MySQL】可重複讀模式下 unique key失效案例MySql模式
- 資料庫中的-髒讀,幻讀,不可重複讀資料庫
- 髒讀!幻讀!不可重複讀!mysql併發事務引發的問題MySql
- MySQL 事務隔離實驗-認識:髒讀、不可重複讀、幻讀MySql
- MySQL 之隔離級別:可重複讀MySql
- 一文詳解髒讀、不可重複讀、幻讀
- Mysql RC/RR隔離原理和區別 不可重複讀和可重複讀MySql
- Mysql可重複讀(1) —— 快照何時建立MySql
- 簡單聊聊mysql的髒讀、不可重複讀MySql
- 資料庫事務隔離級別– 髒讀、幻讀、不可重複讀資料庫
- MySQL rr下幻讀問題分析MySql
- MySQL 實戰 | 08 懵逼,可重複讀好像失效了?MySql
- MySQL選用可重複讀之前一定要想到的事情MySql
- 關於事務、事務的隔離級別以及對髒讀、不可重複讀、幻讀的理解
- MySQL事務(4種事務隔離級別、髒寫、髒讀、不可重複讀、幻讀、當前讀、快照讀、MVCC、事務指標監控)MySqlMVC指標
- 事務四大特性理解,什麼是髒資料、髒讀、不可重複讀、幻覺讀
- 為什麼mysql選可重複讀作為預設的隔離級別MySql
- MySQL 可重複讀,差點就我背上了一個 P0 事故!MySql
- MySQL是怎麼解決幻讀問題的?MySql
- MySQL選用可重複讀之前一定要想到的事情(ICP驗證和勘誤)MySql
- MySQL選用可重複讀之前一定要想到的事情(執行計劃影響)MySql
- MySQL選用可重複讀之前一定要想到的事情(無索引加鎖驗證)MySql索引
- 面試官:MySQL的幻讀是怎麼被解決的?面試MySql
- 什麼是鎖?深入分析解讀MySQL鎖,解決幻讀問題!MySql
- Mysql加鎖過程詳解(3)-關於mysql 幻讀理解MySql
- Mysql加鎖過程詳解(2)-關於mysql 幻讀理解MySql
- 重讀 swift 之一:Optional(可選型)Swift
- InnoDB 是如何解決幻讀的
- MySQL主從複製讀寫分離MySql
- 解決 HttpServletRequest 的輸入流不能重複讀的問題HTTPServlet
- 如何提高程式碼的可讀性? - 讀《編寫可讀程式碼的藝術》
- 重讀 JVMJVM
- 一文讀懂MySQL複製機制MySql
- MySQL主從複製與讀寫分離MySql