READ UNCOMMITTED позволяет читать грязные данные, которые не были зафиксированы другими транзакциями. Механизм SQL Server игнорирует любую блокировку читаемой таблицы и считывает данные непосредственно из памяти.
READ COMMITTED прочитает данные, которые уже были COMMITTED, но будет ждать, если на данные влияет другая транзакция.
Таким образом, в приведенном примере система не только читает, но и пытается УДАЛИТЬ строку, которая еще не была СОВЕРШЕНА, поэтому оба будут ждать завершения другой транзакции, поэтому пример является типичным примером для DEADLOCK.
Чтобы проиллюстрировать разницу между COMMITTED и UNCOMMITTED, я покажу вам простой и понятный пример, который мы запустим дважды в двух режимах.
-- Query Window 1
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; -- Prepare for first Run
SET TRANSACTION ISOLATION LEVEL READ COMMITTED; -- Prepare for second Run
BEGIN TRANSACTION -- Step 1
INSERT INTO Audit (ProductID, PrevValue, NewValue, ChangedBy)
VALUES (1, 'AAA', 'aaa', SYSTEM_USER); -- Step 3
COMMIT TRANSACTION -- Step 5
-- Query Window 2
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; -- Prepare for first Run
SET TRANSACTION ISOLATION LEVEL READ COMMITTED; -- Prepare for second Run
BEGIN TRANSACTION -- Step 2
SELECT * FROM Audit WHERE PrevValue = 'AAA' -- Step 4
COMMIT TRANSACTION -- Step 6
Мы должны запустить сначала строку для UNCOMMITTED LEVEL в обоих запросах, а затем перейти к первому, выполнить шаг 1, перейти ко второму, шагу 2 и так далее. В UNCOMMITTED, когда мы запускаем шаг 4, мы сразу же увидим результаты, поскольку мы делаем грязное чтение (из памяти). Для второго запуска мы сначала удалим тест строки с помощью:
DELETE FROM Audit WHERE PrevValue LIKE 'AAA';
Затем запустит строку для COMMITTED LEVEL в обоих окнах запроса и запустит ту же последовательность. Мы увидим, что теперь, когда мы запускаем Шаг 4, система остается без ответа. Как раз в тот момент, когда мы запускаем шаг 5, чтобы зафиксировать вставку, окно покажет результаты.
Я надеюсь, что теперь вопрос стал более ясным.
person
Angel M.
schedule
06.01.2019