資料庫的隔離級別

2021-06-27 05:28:18 字數 2506 閱讀 3029

資料庫事務的隔離級別有4

個,由低到高依次為

read uncommitted

、read committed

、repeatable read

、serializable

,這四個級別可以逐個解決髒讀、不可重複讀、幻讀這幾類問題。

√: 可能出現

×: 不會出現

髒讀不可重複讀

幻讀read uncommitted 讀未提交

read committed 讀提交

repeatable read重複讀

serializable序列化

注意:我們討論隔離級別的場景,主要是在多個事務併發的情況下,因此,接下來的講解都圍繞事務併發。

read uncommitted 讀未提交

公司發工資了,領導把5000

元打到singo

的賬號上,但是該事務並未提交,而

singo

正好去檢視賬戶,發現工資已經到賬,是

5000

元整,非常高興。可是不幸的是,領導發現發給

singo

的工資金額不對,是

2000

元,於是迅速回滾了事務,修改金額後,將事務提交,最後

singo

實際的工資只有

2000

元,singo

空歡喜一場。

出現上述情況,即我們所說的髒讀,兩個併發的事務,「事務a

:領導給

singo

發工資」、「

事務b:singo

查詢工資賬戶

」,事務

b讀取了事務

a尚未提交的資料。

當隔離級別設定為read uncommitted

時,就可能出現髒讀,如何避免髒讀,請看下乙個隔離級別。

read committed 讀提交

singo拿著工資卡去消費,系統讀取到卡里確實有

2000

元,而此時她的老婆也正好在網上轉賬,把

singo

工資卡的

2000

元轉到另一賬戶,並在

singo

之前提交了事務,當

singo

扣款時,系統檢查到

singo

的工資卡已經沒有錢,扣款失敗,

singo

十分納悶,明明卡里有錢,為何

......

出現上述情況,即我們所說的不可重複讀,兩個併發的事務,「事務a

:singo消費」

、「事務b

:singo

的老婆網上轉賬

」,事務

a事先讀取了資料,事務

b緊接了更新了資料,並提交了事務,而事務

a再次讀取該資料時,資料已經發生了改變。

當隔離級別設定為read committed

時,避免了髒讀,但是可能會造成不可重複讀。

大多數資料庫的預設級別就是read committed

,比如sql server , oracle

。如何解決不可重複讀這一問題,請看下乙個隔離級別。

repeatable read 重複讀

當隔離級別設定為repeatable read

時,可以避免不可重複讀。當

singo

拿著工資卡去消費時,一旦系統開始讀取工資卡資訊(即事務開始),

singo

的老婆就不可能對該記錄進行修改,也就是

singo

的老婆不能在此時轉賬。

雖然repeatable read

避免了不可重複讀,但還有可能出現幻讀。

singo的老婆工作在銀行部門,她時常通過銀行內部系統檢視

singo

的信用卡消費記錄。有一天,她正在查詢到

singo

當月信用卡的總消費金額(

select sum(amount) from transaction where month = 

本月)為

80元,而

singo

此時正好在外面胡吃海塞後在收銀台買單,消費

1000

元,即新增了一條

1000

元的消費記錄(

insert transaction ... 

),並提交了事務,隨後

singo

的老婆將

singo

當月信用卡消費的明細列印到

a4紙上,卻發現消費總額為

1080

元,singo

的老婆很詫異,以為出現了幻覺,幻讀就這樣產生了。

注:mysql

的預設隔離級別就是

repeatable read

。serializable 序列化

serializable是最高的事務隔離級別,同時代價也花費最高,效能很低,一般很少使用,在該級別下,事務順序執行,不僅可以避免髒讀、不可重複讀,還避免了幻像讀。

事物:@transactional(isolation=isolation.read_committed)

資料庫隔離級別

read uncommited 讀未提交 最低級別,可讀取未提交事物的資料,這會導致髒讀,比如 某時刻會話a修改了乙個資料,但還未提交,此時會話b,讀取了該資料,這是,會話a回滾了事物,這就導致資料出現了不一致狀態,這就是髒讀 read commited 提交讀 避免了髒讀,但會導致不可重複讀,例如...

資料庫隔離級別

資料庫事務的隔離級別有4個,由低到高依次為read uncommitted read committed repeatable read serializable,這四個級別可以逐個解決髒讀 不可重複讀 幻讀這幾類問題。可能出現 不會出現 髒讀 不可重複讀 幻讀read uncommitted re...

資料庫隔離級別

資料庫事務的隔離級別有4個,由低到高依次為read uncommitted read committed repeatable read serializable,這四個級別可以逐個解決髒讀 不可重複讀 幻讀這幾類問題。可能出現 不會出現 髒讀不可重複讀 幻讀read uncommitted rea...