摘抄自:http://www.cnblogs.com/wzcheng/archive/2006/10/18/532243.html
設(shè)置事務(wù)的級別 SET TRANSACTION ISOLATION LEVEL
A、READ COMMITTED :指定在讀取數(shù)據(jù)時控制共享鎖以避免臟讀,但數(shù)據(jù)可在事務(wù)結(jié)束前更改,從而產(chǎn)生不可重復(fù)讀取或幻像數(shù)據(jù)。該選項是 SQL Server 的默認值。
B、READ UNCOMMITTED:執(zhí)行臟讀或 0 級隔離鎖定,這表示不發(fā)出共享鎖,也不接受排它鎖。當(dāng)設(shè)置該選項時,可以對數(shù)據(jù)執(zhí)行未提交讀或臟讀;在事務(wù)結(jié)束前可以更改數(shù)據(jù)內(nèi)的數(shù)值,行也可以出現(xiàn)在數(shù)據(jù)集中或從數(shù)據(jù)集消失。這是四個隔離級別中限制最小的級別。
C、REPEATABLE READ:鎖定查詢中使用的所有數(shù)據(jù)以防止其他用戶更新數(shù)據(jù),但是其他用戶可以將新的幻像行插入數(shù)據(jù)集,且幻像行包括在當(dāng)前事務(wù)的后續(xù)讀取中。因為并發(fā)低于默認隔離級別,所以應(yīng)只在必要時才使用該選項。
D、SERIALIZABLE:在數(shù)據(jù)集上放置一個范圍鎖,以防止其他用戶在事務(wù)完成之前更新數(shù)據(jù)集或?qū)⑿胁迦霐?shù)據(jù)集內(nèi)。這是四個隔離級別中限制最大的級別。因為并發(fā)級別較低,所以應(yīng)只在必要時才使用該選項。該選項的作用與在事務(wù)內(nèi)所有 SELECT 語句中的所有表上設(shè)置 HOLDLOCK 相同。
注釋
一次只能設(shè)置這些選項中的一個,而且設(shè)置的選項將一直對那個連接保持有效,直到顯式更改該選項為止。這是默認行為,除非在語句的 FROM 子句中在表級上指定優(yōu)化選項。
SET TRANSACTION ISOLATION LEVEL 的設(shè)置是在執(zhí)行或運行時設(shè)置,而不是在分析時設(shè)置。
術(shù)語解釋:
在一個程序中,依據(jù)事務(wù)的隔離級別將會有三種情況發(fā)生。
◆臟讀:一個事務(wù)會讀進還沒有被另一個事務(wù)提交的數(shù)據(jù),所以你會看到一些最后被另一個事務(wù)回滾掉的數(shù)據(jù)。
◆ 讀值不可復(fù)現(xiàn):一個事務(wù)讀進一條記錄,另一個事務(wù)更改了這條記錄并提交完畢,這時候第一個事務(wù)再次讀這條記錄時,它已經(jīng)改變了。
◆ 幻影讀:一個事務(wù)用Where子句來檢索一個表的數(shù)據(jù),另一個事務(wù)插入一條新的記錄,并且符合Where條件,這樣,第一個事務(wù)用同一個where條件來檢索數(shù)據(jù)后,就會多出一條記錄。
(以上文章摘自網(wǎng)絡(luò))
結(jié)合以上的理論知識,將IsolationLevel枚舉的各值解釋如下:
ReadCommitted:
假設(shè)A事務(wù)對正在讀取數(shù)據(jù)Data放置了共享鎖,那么Data不能被其它事務(wù)改寫,所以當(dāng)B事務(wù)對Data進行讀取時總和A讀取的Data數(shù)據(jù)是一致的,所以避免了臟讀。由于在A沒有提交之前可以對Data進行改寫,那么B讀取到的某個值可能會在其讀取后被A更改從而導(dǎo)致了該值不能被重復(fù)取得;或者當(dāng)B再次用相同的where字句時得到了和前一次不一樣數(shù)據(jù)的結(jié)果集,也就是幻像數(shù)據(jù)。
ReadUncommitted:
假設(shè)A事務(wù)即不發(fā)布共享鎖,也不接受獨占鎖,那么并發(fā)的B或者其它事務(wù)可以改寫A事務(wù)讀取的數(shù)據(jù),那么并發(fā)的C事務(wù)讀取到的數(shù)據(jù)的狀態(tài)和A的或者B的數(shù)據(jù)都可能不一致,那么。臟讀、不可重復(fù)讀、幻象數(shù)據(jù)都可能存在。
RepeatableRead:
(注意MSDN原文中的第一句話:在查詢中使用的所有數(shù)據(jù)上放置鎖,所以不存在臟讀的情況)。
假設(shè)A事務(wù)對讀取的所有數(shù)據(jù)Data放置了鎖,以阻止其它事務(wù)對Data的更改,在A沒有提交之前,新的并發(fā)事務(wù)讀取到的數(shù)據(jù)如果存在于Data中,那么該數(shù)據(jù)的狀態(tài)和A事務(wù)中的數(shù)據(jù)是一致的,從而避免了不可重復(fù)的讀取。但在A事務(wù)沒有結(jié)束之前,B事務(wù)可以插入新記錄到Data所在的表中,那么其它事務(wù)再次用相同的where字句查詢時,得到的結(jié)果數(shù)可能上一次的不一致,也就是幻像數(shù)據(jù)。
Serializable:
在數(shù)據(jù)表上放置了排他鎖,以防止在事務(wù)完成之前由其他用戶更新行或向數(shù)據(jù)集中插入行,這是最嚴格的鎖。它防止了臟讀、不可重復(fù)讀取和幻象數(shù)據(jù)。
以下是對照表:
隔離級別 |
臟讀(Dirty Read) |
不可重復(fù)讀(NonRepeatable Read) |
幻讀(Phantom Read) |
讀未提交(Read uncommitted) |
可能 |
可能 |
可能 |
讀已提交(Read committed) |
不可能 |
可能 |
可能 |
可重復(fù)讀(Repeatable read) |
不可能 |
不可能 |
可能 |
可串行化(Serializable ) |
不可能 |
不可能 |
不可能 |