理解SQL Read committed&读取未提交

时间:2010-11-30 12:03:42

标签: sql-server

我正在使用带有AdventureWorksLT2008数据库的SQL Server Express 2008来理解Read committed& amp;阅读未提交。

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

  

READ COMMITTED

     

查询检索的数据记录是   没有阻止修改   其他一些交易。

假设有一个名为 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

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

1 个答案:

答案 0 :(得分:6)

当在交易中读取数据时,该交易所做的任何更改都是可见的 - 仅在该交易中(尽管READ UNCOMMITTED对此进行了更改)。所以,即使您已经启动了第二个嵌套的事务,您仍然处于第一个事务的范围内,因此可以读取已更改的数据并获取“更改的值”。

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