03.05 怎麼理解SQL的四個事務隔離級別?

管海玲


你好,我是小黃,這個題目我來回答下。


事務的隔離級別是為了解決併發問題。那麼先來了解下併發帶來的問題:

1)丟失更新 Lost Update:(沒有加鎖)

兩個事務同時更新一行數據,最後一個事務的更新會覆蓋掉第一個事務的更新,從而導致第一個事務更新的數據丟失,這是由於沒有加鎖造成的。

2)髒讀Dirty Reads:(沒有隔離)

一個事務看到了另外一個事物沒有提交的更新數據。這是事務沒有隔離造成的。

3)不可重複讀:Non-Repeatable Reads

在同一事務中,多次讀取同一數據但是返回不同的結果,也就是有其他事務更改了這些數據。

4)幻讀:Phantom Reads 併發造成的

一個事務在執行過程中讀取到另一個事務已提交的插入數據。就是說在第一個事務開始時,讀取到一批數據,但是伺候另一個事務又插入新數據並提交,此時第一個事務又讀取到這批數據但是發現多出了一條,貌似產生幻覺一樣。這是併發造成的。


接下來我們說說這四個隔離級別,

1)未提交讀(Read Uncommitted):一個事務能夠讀取到 別的事務中沒有提交的更新數據。事務可以讀取到未提交的數據,這也被稱為髒讀(dirty read)。

所以這種級別很有可能讀到髒數據,隔離級別最低。

2)提交讀(Read Committed):一個事務只能讀取到別的事務提交的更新數據。

一般我們提交讀就可以了。只能讀取到已經提交的數據。即解決了髒讀,但未解決不可重複讀。(oracle默認的)

3)可重複讀(Repeated Read):保證同一事務中先後執行的多次查詢將返回同意結果,不受其他事務的影響。這種隔離級別可能出現幻讀。(mysql默認的)

4)序列化(Serializable):不允許事務併發執行,強制事務串行執行,就是在讀取的每一行數據上都加上了鎖,讀寫相互都會阻塞。這種隔離級別最高,是最安全的,性能最低,不會出現髒讀,不可重複讀,幻讀,丟失更新。


那麼怎麼設置隔離級別呢

SET TRANSACTION ISOLATION LEVEL READ COMMITTED; //設置提交讀隔離級別

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; //設置序列化隔離級別


以上請參考。



五星村小黃


四個隔離級別有READ_UNCOMMITTED,READ_COMMITTED,REPEATABLE_READ,SERIALIZABLE,目的是為了解決數據在高併發下所產生的

問題,這些問題就是Dirty Read(髒讀)、Unrepeatable Read(不可重複讀)、Phantom Read(幻讀)

髒讀就是事務A讀取了事務B未提交的數據,並在這個基礎上又做了其他操作。

不可重複讀就是事務A讀取了事務B已提交的更改數據。

幻讀就是事務A讀取了事務B已提交的新增數據。

對於髒讀是非常要不得的,否則會出現大問題,所以一定要解決掉!

對於不可重複讀還是可以理解的,因為有人提交了事務,在數據庫中已經持久化了,所以當再次讀取的話肯定發生了變化。


下面的內容是哪個隔離級別可以處理那些高併發出現的問題

事務隔離級別 髒讀\t不可重複讀\t幻讀

READ_UNCOMMITTED\t允許 允許 允許

READ_COMMITTED 禁止\t允許 允許

REPEATABLE_READ 禁止\t禁止 允許

SERIALIZABLE 禁止\t禁止 禁止


分享到:


相關文章: