1. 程式人生 > >MySQL事務的幻讀

MySQL事務的幻讀

幻讀——PHANTON READ
又稱為虛度,是指在一個事務內,兩次查詢中資料條數不一致
幻讀和不可重複讀類似,都是在兩次查詢過程中,區別,幻讀是由於其他事務做了插入記錄的操作,導致,記錄條數有所增加

設定b賬戶的隔離級別
B賬戶,由於,前面將事務的隔離級別設定為REPEATABLE READ——可重複讀,這種隔離級別可以避免幻讀的出現
因此,需要將事務的隔離級別設定的更低,設定為READ COMMITTED

這裡寫圖片描述

演示幻讀

B賬戶,首先,在b賬戶中開啟一個事務,在事務中查詢賬戶的餘額

這裡寫圖片描述

A賬戶,在對a賬戶操作之前,查詢當前賬戶中的資訊

這裡寫圖片描述

對a賬戶執行新增操作,a賬戶不用開啟事務,直接執行新增操作

這裡寫圖片描述

B賬戶,當a賬戶新增成功後,在b賬戶中,再次查詢賬戶的餘額

這裡寫圖片描述

可以看出,第二次查詢比第一次查詢,多了一條記錄
這種情況不是錯誤的,但是,不符合實際需求,演示完成,將b賬戶中的事務提交

重新設定b賬戶的隔離級別
B賬戶,為了防止出現幻讀,將b賬戶的隔離級別設定為REPEATABLE READ

這裡寫圖片描述

驗證是否出現幻讀

B賬戶,重新開啟一個事務,查詢當前賬戶的餘額

這裡寫圖片描述

A賬戶,進行新增操縱之前,先檢視賬戶中的資訊

這裡寫圖片描述

對a賬戶執行新增操作,不開啟事務,直接執行新增操作

這裡寫圖片描述

B賬戶,當a賬戶執行完新增操作,再次,查詢當前賬戶中的資訊

這裡寫圖片描述

可以看出,兩次查詢結果一致,在同一個事務中,兩次的查詢結果是一致的

因此,事務的隔離級別為REPEATABLE READ,可以避免幻讀
最後,使用commit提交當前事務,提交之後,查詢賬戶的餘額

這裡寫圖片描述

可以看出,賬戶的資訊已經修改,添加了一條新紀錄