вторник, 5 июля 2011 г.

MSSQL : Уровни изоляции в MS SQL - READ COMMITTED

Все существует 5 уровней изоляции транзакций
READ UNCOMMITTED
READ COMMITTED
REPEATABLE READ
SNAPSHOT
SERIALIZABLE

READ COMMITTED
В режиме READ COMMITTED инструкции sql запроса будут читать только те данные, которые были зафиксированы предыдущими/параллельными транзакциями. Если же на читаемы данные была наложена блокировка, то текущий пакет инструкций будет ожидать высвобождения ресурса. Например, есть два пакета инструкций, запущенных одновременно, рассмотрим пример, в Microsoft SQL Manegment Studio откроем 2 окна запроса, в первом запустите следующий код
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
GO
BEGIN TRANSACTION
SELECT * FROM t1

UPDATE t1
SET textdata = 'Thread_1'
WHERE row = 1

-- !!!Важно!!! - не фиксируем транзакцию
GO
во втором запускаем аналогичный код
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
GO
BEGIN TRANSACTION
SELECT * FROM t1

UPDATE t1
SET textdata = 'Thread_2'
WHERE row = 1

SELECT * FROM t1

COMMIT TRANSACTION
GO
В результате, если запустить 1-й код а следом запустить 2-й, мы получим во 2-м коде ожидание завершения транзакции в первом окне.
Добавьте в первое окно следующую строку:
COMMIT TRANSACTION

И исполните только ее. Переключившись во 2-е окно мы увидим результат выполнения 2-го пакета , две выборки до изменения и после внесения изменений в таблицу t1.
Принцип работы этих пакетов можно отобразить на временной оси.


момент времени123456
запрос 1начало транзакциивнесение измененийфиксация изменений
запрос 1начало транзакцииожидание запроса 1внесение измененийфиксация транзакции

Комментариев нет: