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

來源:互聯網
上載者:User

標籤:

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):事務的隔離等級出現問題之 幻讀

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.