sql-server – 了解SQL Read committed和Read uncommitted

我使用SQL Server Express 2008 w / AdventureWorksLT2008 DB来理解Read committed& amp;读取未提交.

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

READ COMMITTED

Data records retrieved by a query are
not prevented from modification by
some other transactions.

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

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

结果如下:

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

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

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

转载注明原文:sql-server – 了解SQL Read committed和Read uncommitted - 代码日志