MySQL(26):事務的隔離級別出現問題之 幻讀

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帳戶查詢結果以下:

相關文章
相關標籤/搜索