標籤:
1. 幻讀
幻讀(Phantom Read)又稱為虛讀,是指在一個事務內兩次查詢中資料條數不一致,幻讀和不重複讀有些類型,同樣是在兩次查詢過程中,不同的是,幻讀是由於其他事務做了插入記錄的操作,導致記錄數有所增加。
例如:銀行在做統計報表時統計account表中所有使用者的總金額時候,此時總共有三個賬戶,總共金額為3000元,這時候新增了一個使用者賬戶,並且存入1000元,這時候銀行再次統計就會發現賬戶總金額為4000,造成了幻讀情況
2. 示範幻讀:
(1)首先我們設定b賬戶的隔離等級
b賬戶:由於前面將事務個隔離等級設定為可重複讀,這種隔離等級是可以避免幻讀的出現,因此需要將事務的隔離等級設定為更低,下面將事務的隔離等級設定為
Read Committed,具體語句如下:
set session transaction isolation level read committed;
上述語句執行完成之後,b賬戶事務的隔離等級為Read Committed
(2)示範幻讀:
b賬戶:首先在b賬戶中開啟一個事務,然後在當前事務中查詢賬戶的餘額資訊,查詢結果如下:
a賬戶:在對a賬戶進行添加操作之前,使用select語句查看當前a賬戶中的資訊,執行結果如下:
接下來對a賬戶進行添加操作,a賬戶不用開啟事務,直接執行添加操作即可,具體語句如下:
insert into account(name,money) values(‘c‘,1000);
執行結果如下:
b賬戶:當a賬戶添加記錄完成之後,可以在b賬戶中重新查詢場合餘額資訊,如下:
通過對比b賬戶設定Read Committed隔離等級前後,發現第二次查詢資料時比第一查詢資料時候多一條記錄,這種情況並不是錯誤的,但可能不符合實際需求。需要注意的是,上述情況示範完成之後,將b賬戶中的事務提交。
3. 解決問題:
(1)重新設定b賬戶的隔離等級
b賬戶:為了防止出現幻讀,可以將b賬戶的隔離等級設定為Repeatable Read,具體語句如下:
set session transaction isolation level repeatable read;
上述的語句執行完畢之後,交易隔離等級設定為Repeatable Read
MySQL(26):事務的隔離等級出現問題之 幻讀