Microsoft SQL Server
Уровни изоляции транзакций
Поиск…
Синтаксис
- УСТАНОВИТЬ УРОВЕНЬ ИЗОЛЯЦИИ СТАВКИ {ПРОЧИТАТЬ НЕОБХОДИМЫЕ | ПРОЧИТАЙТЕ ОБЯЗАТЕЛЬНО | ПОВТОРНЫЙ ПРОЧИТАЙТЕ | SNAPSHOT | SERIALIZABLE} [; ]
замечания
Ссылка MSDN: УРОВЕНЬ ИЗОЛЯЦИИ УСТАНОВКИ СТАВКИ
Читать
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
Это самый разрешительный уровень изоляции, поскольку он вообще не вызывает блокировок. Он указывает, что операторы могут читать все строки, включая строки, которые были записаны в транзакциях, но еще не выполнены (т. Е. Они все еще находятся в транзакции). Этот уровень изоляции может подвергаться «грязному чтению».
Чтение переведено
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
Этот уровень изоляции является вторым наиболее разрешительным. Он предотвращает грязные чтения. Поведение READ COMMITTED
зависит от настройки READ_COMMITTED_SNAPSHOT
:
Если установлено значение «ВЫКЛ» (значение по умолчанию), транзакция использует совместные блокировки для предотвращения изменения других транзакций в строках, используемых текущей транзакцией, а также блокирует текущую транзакцию от чтения строк, измененных другими транзакциями.
Если установлено значение ON,
READCOMMITTEDLOCK
таблицыREADCOMMITTEDLOCK
может использоваться для запроса общей блокировки вместо управления версиями строк для транзакций, выполняемых в режимеREAD COMMITTED
.
Примечание: READ COMMITTED
- это поведение SQL Server по умолчанию.
Что такое «грязное чтение»?
Грязные чтения (или незафиксированные чтения) - это чтения строк, которые изменяются открытой транзакцией.
Это поведение можно реплицировать, используя два отдельных запроса: один для открытия транзакции и записи некоторых данных в таблицу без фиксации, а другой - для выбора данных, которые будут записаны (но еще не зафиксированы) с этим уровнем изоляции.
Запрос 1 - Подготовьте транзакцию, но не завершите ее:
CREATE TABLE dbo.demo (
col1 INT,
col2 VARCHAR(255)
);
GO
--This row will get committed normally:
BEGIN TRANSACTION;
INSERT INTO dbo.demo(col1, col2)
VALUES (99, 'Normal transaction');
COMMIT TRANSACTION;
--This row will be "stuck" in an open transaction, causing a dirty read
BEGIN TRANSACTION;
INSERT INTO dbo.demo(col1, col2)
VALUES (42, 'Dirty read');
--Do not COMMIT TRANSACTION or ROLLBACK TRANSACTION here
Запрос 2 - Чтение строк, включая открытую транзакцию:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SELECT * FROM dbo.demo;
Возвращает:
col1 col2 ----------- --------------------------------------- 99 Normal transaction 42 Dirty read
PS: Не забудьте очистить эти демо-данные:
COMMIT TRANSACTION;
DROP TABLE dbo.demo;
GO
Повторяемое чтение
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
Этот уровень изоляции транзакций несколько менее разрешительный, чем READ COMMITTED
, поскольку общие блокировки размещаются во всех данных, считанных каждым оператором транзакции, и удерживаются до завершения транзакции , а не освобождаются после каждого утверждения.
Примечание. Используйте этот параметр только в случае необходимости, так как это скорее приведет к ухудшению производительности базы данных, а также к блокировкам, чем READ COMMITTED
.
снимок
SET TRANSACTION ISOLATION LEVEL SNAPSHOT
Указывает, что данные, считываемые любым оператором в транзакции, будут транзакционной последовательностью версий данных, существовавших в начале транзакции, то есть будут считываться только данные, которые были сделаны до начала транзакции.
Операции SNAPSHOT
не запрашивают или не вызывают блокировки данных, которые читаются, поскольку они только читают версию (или моментальный снимок) данных, которые существовали на момент начала транзакции.
Транзакция, выполняющаяся на уровне изоляции SNAPSHOT
считывает только свои собственные изменения данных во время ее работы. Например, транзакция может обновлять некоторые строки, а затем читать обновленные строки, но это изменение будет видимым только для текущей транзакции до ее фиксации.
Примечание. Параметр ALLOW_SNAPSHOT_ISOLATION
должен быть установлен в положение ON до того, как можно использовать уровень изоляции SNAPSHOT
.
Сериализуемый
SET TRANSACTION ISOLATION LEVEL SERIALIZEABLE
Этот уровень изоляции является наиболее ограничительным. Он запрашивает диапазон, который блокирует диапазон значений ключей, которые считываются каждым оператором в транзакции. Это также означает, что INSERT
из других транзакций будут заблокированы, если строки, которые будут вставлены, находятся в диапазоне, заблокированном текущей транзакцией.
Эта опция имеет тот же эффект, что и установка HOLDLOCK
во всех таблицах во всех SELECT
транзакции.
Примечание. Эта изоляция транзакций имеет самый низкий уровень параллелизма и должна использоваться только при необходимости.