理解事務的隔離性
事務是以可控的方式對資料資源進行訪問的一組操作。其屬性包括原子性、一致性、隔離性和永續性,也就是常說的acid。其中,隔離性是針對資料資源的併發訪問,規定了各個事務之間相互影響的程度。個人認為這是事務的4個特性裡面,比較難理解的乙個。
事實上,事務的隔離性可以分為4種型別的隔離級別:read uncommitted,read committed, repeatable read和serilization。這4個型別的隔離級別在應對資料資源併發訪問可能出現的問題時的要求不一樣。資料資源併發訪問時可能出現的問題有:
www.2cto.com
1. 髒讀:如果乙個事務a對資料進行了更改,但是還沒有提交,而另乙個事務b就可以讀到事務a尚未提交的更新結果。這樣,當事務a進行回滾時,那麼事務b開始讀到的資料就是一筆髒資料。
2. 不可重複讀:同乙個事務在事務過程中,對同乙個資料進行讀取操作,讀取到的結果不同。例如,事務b在事務a的更新操作前讀到的資料,跟在事務a提交此更新操作後讀到的資料,可能不同。
要避免不可重複讀,需要將事務所操作的記錄都加上鎖,不允許其他事務對此記錄進行寫操作。
3. 幻讀:同樣乙個查詢在整個事務中多次執行,查詢所得的結果不同。例如,事務a對全部記錄做了更新操作,尚未提交前,事務b又插入了一條記錄,那麼事務a再次讀取資料庫時,會發現還有一條記錄(即事務b新插入的記錄)沒有做更新。
www.2cto.com
也可以理解成:
要避免髒讀,需要控制在事務沒有提交更新前,其他事務無法看到此事務的更新結果。
要避免髒讀,需要控制在事務沒有提交更新前,其他事務無法看到此事務的更新結果。
要避免幻讀,需要將整張表都鎖住了。
對於隔離級別:
read uncommitted:最低的隔離級別。乙個事務可以讀取另乙個事務沒有提交的更新結果。
read committed:乙個事務的更新操作只有在提交了之後,才會被另乙個事務讀取到同一筆資料更新後的結果
repeatable read:在整個事務中,對同一筆資料的讀取結果是相同的,不管其他事務是否同時在對這筆資料進行更新,也不管這筆更新是否提交。
serilizable:所有的事務操作都必須序列操作。這種隔離級別最高,但是犧牲了系統的併發性。通常會使用其他的隔離級別加上相應的併發鎖機制來控制對資料的訪問。
事務的隔離級別與資料資源併發訪問時的問題的對應關係可以如下表所示:
www.2cto.com 髒讀
不可重複讀 幻讀
read uncommited 可能
可能 可能
read commited
不可能 可能
可能repeatable read
不可能不可能 可能
serilization
不可能不可能
不可能www.2cto.com
總體來說,隔離級別與系統併發性成反比,與資料一致性成正比。一般資料庫預設的隔離級別是:readcommited,不同資料庫支援的隔離級別可能不一樣。為了實現資料一致性和系統並發行的平衡,一般會採取read committed加上鎖表等方式來進行。
相應的資料還可以檢視:
《spring揭秘》,第17章,認識事務本身
不可重複讀與幻讀有什麼區別
作者 sunandice
理解事務 原子性 一致性 隔離性
事務是指對系統進行的一組操作,為了保證系統的完整性,事務需要具有acid特性,具體如下 1.原子性 atomic 乙個事務包含多個操作,這些操作要麼全部執行,要麼全都不執行。實現事務的原子性,要支援回滾操作,在某個操作失敗後,回滾到事務執行之前的狀態。回滾實際上是乙個比較高層抽象的概念,大多數db在...
理解事務的ACID和隔離級別
事務 transaction 是訪問並可能更新資料庫中各種資料項的乙個程式執行單元 unit 事務是乙個資料庫概念。但我理解資料庫也是一款軟體,只是遵循了資料庫sql標準,理解事務,先看看資料庫軟體的邏輯結構,這是mysql的邏輯結構 可見mysql支援多客戶端訪問,對應到mysql裡面就是多執行緒...
理解事務的4種隔離級別
資料庫事務的隔離級別有4種,由低到高分別為read uncommitted read committed repeatable read serializable 而且,在事務的併發操作中可能會出現髒讀,不可重複讀,幻讀。下面通過事例一一闡述它們的概念與聯絡。read uncommitted 讀未提...