理解SQL Read committed和Read uncommitted

Che*_*ung 4 sql-server

我使用SQL Server Express 2008 w/AdventureWorksLT2008 DB来理解Read committed和Read uncommitted之间的差异.

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

阅读提交

某些其他事务不会阻止查询检索的数据记录被修改.

假设有一个名为SalesLT.Address的表和一个列AddressLine2,其中所有行都有空值

替代文字

然后我运行这个查询:

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
*/ 
Run Code Online (Sandbox Code Playgroud)

因此,您可以看到第一个事务尚未提交,第二个事务开始查询数据.

结果如下:

替代文字

那么,为什么第二个交易可以检索幻像数据,即使第一个交易仍未提交?

Wil*_*l A 6

在事务内部读取数据时,该事务所做的任何更改都是可见的 - 仅在该事务中(尽管READ UNCOMMITTED对此进行了更改).所以上面,即使你已经启动了第二个嵌套的事务,你仍然在第一个事务的范围内,因此可以读取更改的数据并获得"更改的值".

例如,在单独的SPID上的另一个事务将阻止它是否使用READ COMMITTED并尝试读取此数据.