資料庫隔離級別

2021-08-31 19:51:14 字數 1268 閱讀 5304

在乙個程式中,依據事務的隔離級別將會有三種情況發生。

◆髒讀:乙個事務會讀進還沒有被另乙個事務提交的資料,所以你會看到一些最後被另乙個事務回滾掉的資料。

◆ 讀值不可復現:乙個事務讀進一條記錄,另乙個事務更改了這條記錄並提交完畢,這時候第乙個事務再次讀這條記錄時,它已經改變了。

◆ 幻影讀:乙個事務用where子句來檢索乙個表的資料,另乙個事務插入一條新的記錄,並且符合where條件,這樣,第乙個事務用同乙個where條件來檢索資料後,就會多出一條記錄。

(以上文章摘自網路)

結合以上的理論知識,將isolationlevel列舉的各值解釋如下:

readcommitted:

假設a事務對正在讀取資料data放置了共享鎖,那麼data不能被其它事務改寫,所以當b事務對data進行讀取時總和a讀取的data資料是一致的,所以避免了髒讀。由於在a沒有提交之前可以對data進行改寫,那麼b讀取到的某個值可能會在其讀取後被a更改從而導致了該值不能被重複取得;或者當b再次用相同的where字句時得到了和前一次不一樣資料的結果集,也就是幻像資料。

readuncommitted:

假設a事務即不發布共享鎖,也不接受獨佔鎖,那麼併發的b或者其它事務可以改寫a事務讀取的資料,那麼併發的c事務讀取到的資料的狀態和a的或者b的資料都可能不一致,那麼。髒讀、不可重複讀、幻象資料都可能存在。

repeatableread:

(注意msdn原文中的第一句話:在查詢中使用的所有資料上放置鎖,所以不存在髒讀的情況)。

假設a事務對讀取的所有資料data放置了鎖,以阻止其它事務對data的更改,在a沒有提交之前,新的併發事務讀取到的資料如果存在於data中,那麼該資料的狀態和a事務中的資料是一致的,從而避免了不可重複的讀取。但在a事務沒有結束之前,b事務可以插入新記錄到data所在的表中,那麼其它事務再次用相同的where字句查詢時,得到的結果數可能上一次的不一致,也就是幻像資料。

serializable:

在資料表上放置了排他鎖,以防止在事務完成之前由其他使用者更新行或向資料集中插入行,這是最嚴格的鎖。它防止了髒讀、不可重複讀取和幻象資料。

以下是對照表:

隔離級別 髒讀(dirty read) 不可重複讀(nonrepeatable read) 幻讀(phantom read)

讀未提交(read uncommitted) 可能 可能 可能

讀已提交(read committed) 不可能 可能 可能

可重複讀(repeatable read) 不可能 不可能 可能

可序列化(serializable ) 不可能 不可能 不可能

資料庫隔離級別

read uncommited 讀未提交 最低級別,可讀取未提交事物的資料,這會導致髒讀,比如 某時刻會話a修改了乙個資料,但還未提交,此時會話b,讀取了該資料,這是,會話a回滾了事物,這就導致資料出現了不一致狀態,這就是髒讀 read commited 提交讀 避免了髒讀,但會導致不可重複讀,例如...

資料庫隔離級別

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

資料庫隔離級別

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