1. 程式人生 > 實用技巧 >資料庫隔離級別

資料庫隔離級別

目前資料庫MySQL 併發事務下,在不同的隔離級別下,可能會出現四個問題.分別是:髒寫(Lost Update),髒讀(Dirty Reads),不可重複讀(Non-Repeatable Reads),幻讀(Phantom Reads)

資料庫的隔離級別分別是:未提交讀(read uncommitted)、已提交讀(read committed)、可重複讀(repeatable read)、序列化(serializable)

1.檢視MySQL目前的隔離級別,預設是 可重複讀

select @@transaction_isolation;

2.設定當前會話期間的事務隔離級別

set session transaction isolation level 事務隔離級別
set session transaction isolation level REPEATABLE READ;

我們現在來看下,如何復現不同隔離級別下的併發問題

1.髒寫:如果一個事務修改了另一個未提交事務修改過的資料,那就意味著發生了髒寫

由於髒寫問題過於嚴重,所以每一個事務隔離級別都防止了該情況發生

2.髒讀:一個事務已經更新一些資料到資料庫,但還沒有提交。另一個事務可以看到未提交的資料

該情況需在 隔離級別為:讀未提交下才會出現

這個時候發現,在右框開啟事務後,修改一條資料,沒有顯示commit, 在左邊就可以查詢到還沒有提交更新後的資料,這種情況就叫 髒讀!

3.不可重複讀:這種情況發生 在一個事務內多次讀同一資料。A事務查詢某條資料,該事務未結束時,B事務也訪問同一資料並進行了修改。那麼在A事務中的兩 次讀資料之間,由於第二個事務的修改,那麼第一個事務兩次讀到的的資料可能是不一樣的。

按照上面操作的步驟,可以重現不可重複讀的問題

讀已提交的隔離級別可以看到,避免了髒讀的出現,但是沒有避免不可重複讀的出現!

這次的事務隔離級別為 可重複讀,可以看到避免了 不可重複讀的併發問題!

4.虛讀 / 幻讀 : 事務A在操作一堆資料的時候,事務B插入了一條資料,A事務再次查詢,發現多了一條資料,像是幻覺。與不可重複讀類似,不同的是一個是修改,一個是新增或者刪除。

這個時候發現,在 可重複讀的隔離級別下,幻讀的情況也解決了?~

我們再看下 另外一種情況

這個時候 我們發現,在可重複讀的隔離級別下,並沒有完全解決幻讀這個問題,他只是解決了時候的幻讀問題, 沒有解決

的時候的幻讀的問題