SQL-事務
事務的隔離級別
資料庫事務的隔離級別有4種,由低到高分別為Read uncommitted 、Read committed 、Repeatable read 、Serializable 。而且,在事務的併發操作中可能會出現髒讀,不可重複讀,幻象讀。
隔離級別 | 髒讀 | 不可重複讀 | 幻象讀 |
Read uncommitted | ✔ | ✔ | ✔ |
Read committed | ✘ | ✔ | ✔ |
Repeatable read | ✘ | ✘ | ✔ |
Serializable | ✘ | ✘ | ✘ |
Read uncommitted( 未提交讀 )
一個事務可以讀取另一個未提交事務的資料。
事例:老闆要給程式設計師發工資,程式設計師的工資是 3.6萬 /月。但是發工資時老闆不小心按錯了數字,按成 3.9萬 /月,該錢已經打到程式設計師的戶口,但是事務還沒有提交,就在這時,程式設計師去檢視自己這個月的工資,發現比往常多了 3千 元,以為漲工資了非常高興。但是老闆及時發現了不對,馬上回滾差點就提交了的事務,將數字改成 3.6萬 再提交。
分析:實際程式設計師這個月的工資還是 3.6萬,但是程式設計師看到的是 3.9萬 。他看到的是老闆還沒提交事務時的資料。這就是髒讀。
Read committed( 提交讀 )
一個事務要等另一個事務提交後才能讀取資料。
事例:程式設計師拿著信用卡去享受生活( 卡里當然是只有 3.6萬 ),當他埋單時( 程式設計師事務開啟 ),收費系統事先檢測到他的卡里有 3.6萬,就在這個時候!!程式設計師的妻子要把錢全部轉出充當家用,並提交。當收費系統準備扣款時,再檢測卡里的金額,發現已經沒錢了( 第二次檢測金額當然要等待妻子轉出金額事務提交完 )。程式設計師就會很鬱悶,明明卡里是有錢的…
分析:這就是讀提交,若有事務對資料進行更新( UPDATE )操作時,讀操作事務要等待這個更新操作事務提交後才能讀取資料,可以解決髒讀問題。但在這個事例中,出現了一個事務範圍內兩個相同的查詢卻返回了不同資料
Repeatable read( 可重複讀 )
重複讀,就是在開始讀取資料( 事務開啟 )時,不再允許修改操作
事例:程式設計師拿著信用卡去享受生活(卡里當然是只有3.6萬),當他埋單時( 事務開啟,不允許其他事務的 UPDATE 修改操作 ),收費系統事先檢測到他的卡里有 3.6萬。這個時候他的妻子不能轉出金額了。接下來收費系統就可以扣款了。
分析:重複讀可以解決不可重複讀問題。寫到這裡,應該明白的一點就是,不可重複讀對應的是修改,即UPDATE操作。但是可能還會有幻讀問題。因為幻讀問題對應的是插入插NSERT 操作,而不是 UPDATE 操作。
Serializable 序列化
Serializable 是最高的事務隔離級別,在該級別下,事務序列化順序執行,可以避免髒讀、不可重複讀與幻讀。但是這種事務隔離級別效率低下,比較耗資料庫效能,一般不使用。