1. 幻讀session
幻讀(Phantom Read)又稱爲虛讀,是指在一個事務內兩次查詢中數據條數不一致,幻讀和不重複讀有些類型,一樣是在兩次查詢過程當中,不一樣的是,幻讀是因爲其餘事務作了插入記錄的操做,致使記錄數有所增長。spa
例如:銀行在作統計報表時統計account表中全部用戶的總金額時候,此時總共有三個帳戶,總共金額爲3000元,這時候新增了一個用戶帳戶,而且存入1000元,這時候銀行再次統計就會發現帳戶總金額爲4000,形成了幻讀狀況3d
2. 演示幻讀:code
(1)首先咱們設置b帳戶的隔離級別blog
b帳戶:因爲前面將事務個隔離級別設置爲可重複讀,這種隔離級別是能夠避免幻讀的出現,所以須要將事務的隔離級別設置爲更低,下面將事務的隔離級別設置爲事務
Read Committed,具體語句以下:it
set session transaction isolation level read committed;
上述語句執行完成以後,b帳戶事務的隔離級別爲Read Committedio
(2)演示幻讀:table
b帳戶:首先在b帳戶中開啓一個事務,而後在當前事務中查詢帳戶的餘額信息,查詢結果以下:class
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
(2)從新驗證是否出現幻讀
b帳戶:在b帳戶中從新開啓一個事務,並在該事務中查詢當前帳戶的餘額信息,查詢結果以下:
a帳戶:對a帳戶進行添加操做以前,使用select語句查看當前的a帳戶的餘額信息,執行語句結果以下:
接下來對帳戶a進行添加操做,在a帳戶中不開啓事務,直接執行添加操做,具體語句以下:
insert into account(name,money) values('d',1000);
執行結果以下:
b帳戶:當a帳戶的添加操做執行成功以後,再次查詢當前帳戶的餘額信息,查詢結果以下:
對比b帳戶兩次查詢的結果,發現二者都是一致的。並無出現重複讀取的狀況,所以能夠說明當前事務的隔離級別能夠避免幻讀,最後還有使用commit語句提交當前事務,提交以後,b帳戶查詢結果以下: