Как сделать Dirty Read

Будет ли это примером Dirty Read?

Транзакции T1 и T2

SET IMPLICIT_TRANSACTIONS OFF

Грязный пример чтения

4 ответа

Вот пример того, как построить "грязное чтение", глядя на MyCleanTable



  1. Выполнить простой запрос transaction_a с незафиксированным уровнем изоляции

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

Выход:


  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 читал грязное значение.

Это не грязное чтение. Детали того, что это делает здесь: неявные транзакции

Чтобы получить грязное чтение, вам нужно поставить select column1 из dbo.table1 WITH (NOLOCK). Параметр With (NOLOCK) считывает незафиксированные данные, которые могут исчезнуть и вообще не существовать, если транзакция каким-либо образом откатывается.

Другой способ получить "грязное" чтение - использовать: уровень изоляции считывается незафиксированным.

  1. Первая транзакция начинается
  2. Транзакция вторая начинается
  3. Первая транзакция выполняет операцию обновления
  4. Вторая транзакция выполняет операцию выбора и просматривает грязные данные, созданные первой транзакцией.
  5. Транзакция Одна фиксация или откат

Чтобы реализовать грязное чтение, мы должны сначала выполнить следующую команду

      SET GLOBAL TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
  • Грязное чтение заключается в том, что транзакция считывает незафиксированные данные, которые вставляются, обновляются или удаляются другими транзакциями.

Я экспериментировал с грязным чтением с MSSQL(SQL Server) и двумя командными строками .

Во-первых, я установил READ UNCOMMITTEDуровень изоляции для грязного чтения :

      SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

Затем я создал таблицу с idи nameкак показано ниже.

personстол:

Другие вопросы по тегам