2010-11-30 90 views
4

我正在使用SQL Server Express 2008 w/AdventureWorksLT2008數據庫來了解讀取提交時的不同之處&未提交。瞭解SQL讀取提交和讀取未提交

根據維基百科: http://en.wikipedia.org/wiki/Isolation_%28database_systems%29

提交讀

數據查詢返回的記錄是由 一些 其他事務不被修改沒有阻止。

假設有一個名爲SalesLT.Address我運行此查詢的表和列AddressLine2所有行具有空值

alt text

然後:

SET TRANSACTION ISOLATION LEVEL READ COMMITTED 

BEGIN TRANSACTION 
    update SalesLT.Address set AddressLine2 = 'new value' 

     BEGIN TRANSACTION 
      select AddressLine2 from SalesLT.Address 

--Break Here 
/*  
     COMMIT TRANSACTION 
COMMIT TRANSACTION 
*/ 

所以,你可以看到第一個交易還沒有提交,第二個交易開始查詢數據。

這導致:

alt text

那麼,爲什麼第二交易可檢索的幻像數據甚至一日交易仍然沒有提交?

回答

6

在事務內部讀取數據時,該事務所做的任何更改都是可見的 - 僅在該事務中(儘管READ UNCOMMITTED會更改此內容)。因此,即使您已經開始了第二個嵌套事務,您仍然處於第一個事務的範圍內,因此可以讀取已更改的數據並獲取「已更改的值」。

另一個事務,例如,在一個單獨的SPID上,將阻止它是否使用READ COMMITTED並嘗試讀取此數據。

+1

要添加到此 - 打開一個新的SQL查詢窗口(實際上建立一個新的連接),並嘗試查詢您的表,而您的其他連接在事務中修改了它時,您會看到您的預期這裏 - 你的桌子將被鎖定。 – 2010-11-30 14:13:47