1

这会是脏读的例子吗?

T1 & T2 交易

SET IMPLICIT_TRANSACTIONS OFF

脏读示例

4

3 回答 3

1

脏读 在此处输入图像描述

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

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

SET GLOBAL TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
于 2021-06-17T07:35:41.833 回答
1

这不是脏读。详细信息在这里:隐式交易

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

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

于 2017-06-30T21:26:11.290 回答
1

这是一个如何通过查看构建“脏读”的示例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 节的查询正在读取一个脏值。

于 2021-02-11T19:55:23.113 回答