Как сделать Dirty Read
Будет ли это примером Dirty Read?
Транзакции T1 и T2
SET IMPLICIT_TRANSACTIONS OFF
4 ответа
Вот пример того, как построить "грязное чтение", глядя на
MyCleanTable
Выполнить простой запрос transaction_a с незафиксированным уровнем изоляции
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED BEGIN TRAN SELECT * FROM [MyCleanTable]
Выход:
Обновите таблицу грязным значением с помощью transaction_b:
BEGIN TRAN UPDATE [ConcurrencyDemo].[dbo].[MyCleanTable] SET [Value] = 'I am dirty' WHERE [Id] = 1
Выполните другой запрос в transaction_a и зафиксируйте его:
SELECT * FROM [ConcurrencyDemo].[dbo].[MyCleanTable] COMMIT;
Выход:
Id | Value
----------
1 | I am dirty! ------> "dirty read"
2 | I am clean!
Откатить обновление transaction_b:
ROLLBACK;
На этом этапе таблица была откатана до исходных значений:
Id | Value
----------
1 | I am clean!
2 | I am clean!
Но запрос раздела 3 читал грязное значение.
Это не грязное чтение. Детали того, что это делает здесь: неявные транзакции
Чтобы получить грязное чтение, вам нужно поставить select column1 из dbo.table1 WITH (NOLOCK). Параметр With (NOLOCK) считывает незафиксированные данные, которые могут исчезнуть и вообще не существовать, если транзакция каким-либо образом откатывается.
Другой способ получить "грязное" чтение - использовать: уровень изоляции считывается незафиксированным.
- Первая транзакция начинается
- Транзакция вторая начинается
- Первая транзакция выполняет операцию обновления
- Вторая транзакция выполняет операцию выбора и просматривает грязные данные, созданные первой транзакцией.
- Транзакция Одна фиксация или откат
Чтобы реализовать грязное чтение, мы должны сначала выполнить следующую команду
SET GLOBAL TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
- Грязное чтение заключается в том, что транзакция считывает незафиксированные данные, которые вставляются, обновляются или удаляются другими транзакциями.
Я экспериментировал с грязным чтением с MSSQL(SQL Server) и двумя командными строками .
Во-первых, я установил
READ UNCOMMITTED
уровень изоляции для грязного чтения :
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
Затем я создал таблицу с
id
и
name
как показано ниже.