園子裡有很不錯的介紹SQL Server事務隔離的文章,感覺很多都從概念入手介紹的,對那些初學者來說,看得見摸得 著的理解才深刻,故不再重複,重點在於執行個體示範上面。
首先解釋下事務隔離是幹什麼的,一個事務的隔離等級控制了它怎麼樣影響其它事務和被其它事務所影響。
1.READ UNCOMMITTED,會導致髒讀(能讀取其它事務沒有提交的更改)和不可重複讀取(事務讀取的資料被其它事務 所修改,再次讀取時不一致)
初始化:
CREATE TABLE TranLevel (k int IDENTITY(1,1), val int) INSERT INTO TranLevel(val) values(1) INSERT INTO TranLevel(val) values(2) INSERT INTO TranLevel(val) values(3)
首先執行Query1,再建立查詢立即執行Query2
Query1:
BEGIN TRAN Query1 -- 在事務中修改 UPDATE TranLevel SET val = 9 -- '等待10秒,期間事務2運行' WAITFOR DELAY '00:00:10' -- 不提交修改,復原事務 ROLLBACK TRAN Query1
Query2:
-- 設定當前會話交易隔離等級為未提交讀 SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED BEGIN TRAN Query2 SELECT '事務2開始並發執行,讀取到了事務1修改了但沒有提交的資料,是髒讀' SELECT * FROM Tranlevel SELECT '事務2等待10秒,讓事務1執行完' WAITFOR DELAY '00:00:10' SELECT '兩次讀取的結果不一致,是不可重複讀取' SELECT * FROM TranLevel COMMIT TRAN Query2
下面就看看Query2執行的結果是怎樣的:
結果顯而易見,如果將交易隔離等級設定為未提交讀,則會造成髒讀和不可重複讀取的問題,在這幾個交易隔離等級中 是限制最小的一個,SQL Server分配的資源也最小。