資料庫事務隔離級別

2021-09-09 02:29:37 字數 1770 閱讀 2649

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

資料庫事務隔離級別

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

資料庫事務隔離級別

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

資料庫事務隔離級別

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