代码之家  ›  专栏  ›  技术社区  ›  Cheung

了解SQL读取提交和读取未提交

  •  4
  • Cheung  · 技术社区  · 15 年前

    我正在使用SQL Server Express 2008 w/AdventureWorksLT2008 DB了解read committed与read uncommitted之间的区别。

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

    < Buff行情>

    已提交读取

    查询检索到的数据记录为 未阻止修改 其他一些交易。

    < /块引用>

    假设有一个名为 saleslt.address的表和一个列 addressLine2 which all rows has blank value

    然后我运行这个查询:

    设置事务隔离级别read committed
    
    开始事务
    update saleslt.address set addressLine2='新值'
    
    开始事务
    从Saleslt.Address中选择AddressLine2
    
    --打破这里
    /*
    提交事务
    提交事务
    */
    < /代码> 
    
    

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

    结果:

    那么,为什么第二个事务可以被检索到幻象数据,即使第一个事务仍然没有提交?

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

    读提交

    查询检索到的数据记录为 未阻止修改 其他一些交易。

    假设有一个名为销售地址一列地址线2所有行都有空值

    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 回复  |  直到 15 年前
        1
  •  6
  •   Will A    15 年前

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

    例如,在单独的SPID上的另一个事务,如果使用read committed并尝试读取此数据,则会阻塞该事务。