資料庫事務隔離級別理解

2021-06-28 22:05:13 字數 2218 閱讀 3557

資料庫事務的隔離級別有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是最高的事務隔離級別,同時代價也花費最高,效能很低,一般很少使用,在該級別下,事務順序執行,不僅可以避免髒讀、不可重複讀,還避免了幻像讀。

serializable事務會產生以下效果:

1.語句無法讀取其它事務已修改但未提交的記錄(避免髒讀)。

2.在當前事務完成之前,其它事務不能修改目前事務已讀取的記錄(避免不可重複讀)。

3.在當前事務完成之前,其它事務所插入的新記錄,其索引鍵值不能在當前事務的任何語句所讀取的索引鍵範圍中(簡單理解就是不允許插入新的記錄,鎖表)。

資料庫隔離級別理解

1.為什麼要選擇隔離級別?通過例子說明隔離級別的必要性 假設乙個場景,一對夫妻共用乙個賬戶,妻子喜歡網上支付,丈夫喜歡刷卡支付。第一類丟失情況 整個過程中只有老公消費1000元,而最後時刻,老婆回滾事務,恢復到了原來的10000元,這不符合實際。這樣的兩個事務併發,乙個提交,乙個回滾導致的不一致成為...

MSSQL隔離級別理解

資料庫的六種隔離級別的自我理解 隔離級別 isolation level 分類 未提交事務 read uncommitted 已提交事務 read committed 可重複度 repeatableread 可序列化 serializable 最高端別 其實這幾種隔離級別最終是對資料庫增刪改查進行的...

資料庫事務隔離級別

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