MyISAM不支援事物,所以這些隔離級別是沒有意義的。然後再說一下這些隔離級別和鎖之間的關係(如在InnoDB中,支援行級鎖):首先一個事物由begin開始,由commit(成功執行)或rollback(執行失敗,需要回滾)終止,所以考慮事物問題的時候要考慮到事物的整個生命週期,對同一行資料的加鎖解鎖操作是有可能多次執行的,因此傳統的2 Phase Locking(2PL,兩階段鎖)才會有很多變種,最簡單的是隻要先統一上鎖,後統一釋放鎖就可以了,不用考慮釋放鎖的時間,最嚴格的是所有的鎖一旦加上之後,必須要等到事物commit或rollback後才可以釋放。舉個例子,有一行資料 a,有兩個事物T1,T21.read uncommittedT1對a進行寫操作,寫之前加了寫鎖,寫之後但是commit前釋放了寫鎖,這時候T2是可以讀a的,由於T1還沒有commit,所以T2就發生了read uncommitted的情況。2.read committed還是1中的情況,如果T1把a的寫鎖一直保持到T1 commit成功之後再釋放,那麼T2在T1 commit之前都是不可以讀a的,就可以避免read uncommitted,這就是read committed。但是這種隔離級別下,如果t1插入了一個以前不存在的新行b,t2是可以讀的,就造成了幻讀的情況。3.repeatable read為了避免幻讀,可以加謂詞鎖延遲新行的新增,比如T2要讀大於5的行,那麼就加個謂詞鎖,使得大於5的行不能被新增進去,這種實現基本上也是實現了serializable read基於鎖的事物只是一種方法,一般被成為悲觀併發控制。此外,還有:樂觀併發控制:執行讀寫的時候不加鎖,commit的時候檢測是否有衝突,若沒有衝突commit成功,否則需要rollback,值得注意的是,雖然讀寫的時候沒有加鎖,但是檢測的時候是要加鎖的,否則2個衝突的事物可能同時檢測成功,這一點絕大多數材料裡都沒有指出。MVCC:給每個資料一個版本號,讀的時候完全不需要鎖,寫的時候看具體實現,可以選擇樂觀併發控制,也可以選擇悲觀併發控制,這種實現很容易實現snapshot isolation(也是一種隔離級別,只不過沒有以上幾個名氣大,可以保證每個事物可以看到一個在它發生之前的資料庫完整例項)。
MyISAM不支援事物,所以這些隔離級別是沒有意義的。然後再說一下這些隔離級別和鎖之間的關係(如在InnoDB中,支援行級鎖):首先一個事物由begin開始,由commit(成功執行)或rollback(執行失敗,需要回滾)終止,所以考慮事物問題的時候要考慮到事物的整個生命週期,對同一行資料的加鎖解鎖操作是有可能多次執行的,因此傳統的2 Phase Locking(2PL,兩階段鎖)才會有很多變種,最簡單的是隻要先統一上鎖,後統一釋放鎖就可以了,不用考慮釋放鎖的時間,最嚴格的是所有的鎖一旦加上之後,必須要等到事物commit或rollback後才可以釋放。舉個例子,有一行資料 a,有兩個事物T1,T21.read uncommittedT1對a進行寫操作,寫之前加了寫鎖,寫之後但是commit前釋放了寫鎖,這時候T2是可以讀a的,由於T1還沒有commit,所以T2就發生了read uncommitted的情況。2.read committed還是1中的情況,如果T1把a的寫鎖一直保持到T1 commit成功之後再釋放,那麼T2在T1 commit之前都是不可以讀a的,就可以避免read uncommitted,這就是read committed。但是這種隔離級別下,如果t1插入了一個以前不存在的新行b,t2是可以讀的,就造成了幻讀的情況。3.repeatable read為了避免幻讀,可以加謂詞鎖延遲新行的新增,比如T2要讀大於5的行,那麼就加個謂詞鎖,使得大於5的行不能被新增進去,這種實現基本上也是實現了serializable read基於鎖的事物只是一種方法,一般被成為悲觀併發控制。此外,還有:樂觀併發控制:執行讀寫的時候不加鎖,commit的時候檢測是否有衝突,若沒有衝突commit成功,否則需要rollback,值得注意的是,雖然讀寫的時候沒有加鎖,但是檢測的時候是要加鎖的,否則2個衝突的事物可能同時檢測成功,這一點絕大多數材料裡都沒有指出。MVCC:給每個資料一個版本號,讀的時候完全不需要鎖,寫的時候看具體實現,可以選擇樂觀併發控制,也可以選擇悲觀併發控制,這種實現很容易實現snapshot isolation(也是一種隔離級別,只不過沒有以上幾個名氣大,可以保證每個事物可以看到一個在它發生之前的資料庫完整例項)。