【问题标题】:How to make Dirty Read如何使脏读
【发布时间】:2017-12-01 00:48:58
【问题描述】:

这是脏读的一个例子吗?

T1 和 T2 交易

SET IMPLICIT_TRANSACTIONS OFF

Dirty read example

【问题讨论】:

  • 这是什么环境,甚至?事务处理 SQL?
  • 是T SQL环境

标签: tsql dirtyread


【解决方案1】:

  1. 事务一开始
  2. 事务二开始
  3. 事务一执行更新操作
  4. 事务二做选择操作,查看事务一产生的脏数据
  5. 事务一提交或回滚

为了实现脏读,我们应该先执行以下命令

SET GLOBAL TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

【讨论】:

    【解决方案2】:

    这是一个如何通过查看MyCleanTable 来构造“脏读”的示例

    Id | Value
    ----------
    1  | I am clean!
    2  | I am clean!
    

    1. 使用未提交的隔离级别执行简单查询 transaction_a

      SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
      
      BEGIN TRAN
      
          SELECT * FROM [MyCleanTable]
      

    输出:

    Id | Value
    ----------
    1  | I am clean!
    2  | I am clean!
    
    1. 使用 transaction_b 用脏值更新表:

       BEGIN TRAN
      
           UPDATE [ConcurrencyDemo].[dbo].[MyCleanTable]
           SET [Value] = 'I am dirty'  
           WHERE [Id] = 1 
      
    2. 在 transaction_a 中执行另一个查询并提交它:

          SELECT * FROM [ConcurrencyDemo].[dbo].[MyCleanTable]
      
      COMMIT;
      

    输出:

    Id | Value
    ----------
    1  | I am dirty! ------> "dirty read"
    2  | I am clean!
    
    1. 回滚transaction_b的更新:

      ROLLBACK;
      

    在这个阶段,表被回滚到原来的值:

    Id | Value
    ----------
    1  | I am clean!
    2  | I am clean!
    

    但是第 3 节的查询读取的是脏值。

    【讨论】:

      【解决方案3】:

      这不是脏读。具体操作在这里:implicit transactions

      要获得脏读,您需要将 select column1 from dbo.table1 WITH (NOLOCK)。 With (NOLOCK) 读取未提交的数据,如果事务以某种方式回滚,这些数据可能会消失并且永远不会真正存在。

      获取脏读的另一种方法是使用:未提交的隔离级别读取。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-06-16
        • 2012-03-31
        • 1970-01-01
        • 2016-12-21
        • 2015-01-17
        • 1970-01-01
        • 1970-01-01
        • 2014-10-06
        相关资源
        最近更新 更多