如何制作脏读

时间:2017-06-27 20:21:44

标签: tsql dirtyread

这会是Dirty Read的一个例子吗?

T1& T2交易

SET IMPLICIT_TRANSACTIONS OFF

Dirty read example

3 个答案:

答案 0 :(得分: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 部分的查询正在读取一个脏值。

答案 1 :(得分:1)

dirty read enter image description here

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

要实现脏读,首先要执行如下命令

SET GLOBAL TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

答案 2 :(得分:0)

这不是脏读。这里的详细信息如下:implicit transactions

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

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