1. 程式人生 > >事務隔離級別-轉

事務隔離級別-轉

事物隔離級別

以前一直沒有搞得特別明白,這次又碰上了這個問題,整理一下。 事物隔離級別定義在資料庫併發事務中一個事務中的資料修改對另一個同時執行的事務的影響。 資料庫併發事務中的三個問題:
Dirty Read: 如果能夠讀物沒有提交的事務所做的資料修改,就會發生髒讀的問題。因為事務有可能回滾。
Nonrepeatable Read: 這個主要是因為在一個事物中的兩次讀資料之間,另一個事務對同樣的資料進行了修改,直接導致兩次讀取的資料不 一致。
Phantom Read: 這個可以看成是Nonrepeatable Read的一種特殊情況。兩次讀之間的不一樣的資料是另一個事務新增並提交的記錄。只有當添 加記錄時才會出現這個問題。 為了解決這三個問題,SQL標準中定義了四種事務隔離級別
Serailizable:
所有的事務完全隔離。看起來就像一個事務完成後再去執行另一個事務。
不會出現幻象讀取(phantom reads)
在基於鎖的併發控制中,當查詢帶有where子句時,序列化要求區域鎖(range locks)
在其他的併發控制中,當序列化衝突發生後,事務要回滾,然後再重新開始。 Repeatable Read:
所有讀取中的記錄不能被修改。讀取記錄需要加讀取鎖,不需要區域鎖
當查詢帶有where子句時,可能出現幻象讀取。 Read Committed:
讀取中的記錄可能會被另一個事務進行修改。不可重複讀可能出現。 Read Uncommited:
一個事務能夠訪問另一個事務未提交的修改。會出現髒讀 四種隔離級別分別能夠解決的問題:
Isolation Level  Dirty Read  Nonrepeatable Read  Phantom Read
READ UNCOMMITTED  Permitted  Permitted          Permitted
READ COMMITTED          --          Permitted          Permitted
REPEATABLE READ  --          --                  Permitted
SERIALIZABLE          --          --                  -- 其它廣泛使用的隔離方法:
snapshot isolation:
當讀取資料時,系統生成為這個事務一個快照,這個快照在整個事務中使用,這樣來保證資料在這個事務中的一致性。
更新操作同樣發生在這個快照上,在事務提交之前,不會與任何其它事務所做的修改衝突。
當提交事務時,系統檢查這些修改的資料在快照之後是否被其他事務修改,如果沒有修改,這個事務就可以提交了。
如果有修改,這個事務就需要回滾再重新執行。
snapshot isolation 能夠避免併發事務的三個問題。