資料庫事務的隔離級別有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...