事務隔離級別 轉

2021-05-09 15:22:11 字數 1460 閱讀 3843

事物隔離級別

以前一直沒有搞得特別明白,這次又碰上了這個問題,整理一下。

事物隔離級別定義在資料庫併發事務中乙個事務中的資料修改對另乙個同時執行的事務的影響。

資料庫併發事務中的三個問題:

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 能夠避免併發事務的三個問題。

資料庫事務隔離級別《轉》

事務隔離級別 乙個事務對資料庫的修改與並行的另乙個事務的隔離程度。兩個併發事務同時訪問資料庫表相同的行時,可能存在以下三個問題 1 幻想讀 事務t1讀取一條指定where條件的語句,返回結果集。此時事務t2插入一行新記錄,恰好滿足t1的where條件。然後t1使用相同的條件再次查詢,結果集中可以看到...

資料庫事務隔離級別《轉》

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

事務隔離級別

1 serializable 最嚴格的spring事務隔離級別,事務序列執行,資源消耗最大 3 read committed 大多數主流資料庫的預設spring事務隔離等級,保證了乙個事務不會讀到另乙個並行事務已修改但未提交的資料,避免了 髒讀取 該級別適用於大多數系統。4 read uncommi...