Поиск…


Синтаксис

  • УСТАНОВИТЬ УРОВЕНЬ ИЗОЛЯЦИИ СТАВКИ {ПРОЧИТАТЬ НЕОБХОДИМЫЕ | ПРОЧИТАЙТЕ ОБЯЗАТЕЛЬНО | ПОВТОРНЫЙ ПРОЧИТАЙТЕ | SNAPSHOT | SERIALIZABLE} [; ]

замечания

Ссылка MSDN: УРОВЕНЬ ИЗОЛЯЦИИ УСТАНОВКИ СТАВКИ

Читать

SQL Server 2008 R2
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

Это самый разрешительный уровень изоляции, поскольку он вообще не вызывает блокировок. Он указывает, что операторы могут читать все строки, включая строки, которые были записаны в транзакциях, но еще не выполнены (т. Е. Они все еще находятся в транзакции). Этот уровень изоляции может подвергаться «грязному чтению».

Чтение переведено

SQL Server 2008 R2
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

Повторяемое чтение

SQL Server 2008 R2
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ

Этот уровень изоляции транзакций несколько менее разрешительный, чем READ COMMITTED , поскольку общие блокировки размещаются во всех данных, считанных каждым оператором транзакции, и удерживаются до завершения транзакции , а не освобождаются после каждого утверждения.

Примечание. Используйте этот параметр только в случае необходимости, так как это скорее приведет к ухудшению производительности базы данных, а также к блокировкам, чем READ COMMITTED .

снимок

SQL Server 2008 R2
SET TRANSACTION ISOLATION LEVEL SNAPSHOT

Указывает, что данные, считываемые любым оператором в транзакции, будут транзакционной последовательностью версий данных, существовавших в начале транзакции, то есть будут считываться только данные, которые были сделаны до начала транзакции.

Операции SNAPSHOT не запрашивают или не вызывают блокировки данных, которые читаются, поскольку они только читают версию (или моментальный снимок) данных, которые существовали на момент начала транзакции.

Транзакция, выполняющаяся на уровне изоляции SNAPSHOT считывает только свои собственные изменения данных во время ее работы. Например, транзакция может обновлять некоторые строки, а затем читать обновленные строки, но это изменение будет видимым только для текущей транзакции до ее фиксации.


Примечание. Параметр ALLOW_SNAPSHOT_ISOLATION должен быть установлен в положение ON до того, как можно использовать уровень изоляции SNAPSHOT .

Сериализуемый

SQL Server 2008 R2
SET TRANSACTION ISOLATION LEVEL SERIALIZEABLE

Этот уровень изоляции является наиболее ограничительным. Он запрашивает диапазон, который блокирует диапазон значений ключей, которые считываются каждым оператором в транзакции. Это также означает, что INSERT из других транзакций будут заблокированы, если строки, которые будут вставлены, находятся в диапазоне, заблокированном текущей транзакцией.

Эта опция имеет тот же эффект, что и установка HOLDLOCK во всех таблицах во всех SELECT транзакции.


Примечание. Эта изоляция транзакций имеет самый низкий уровень параллелизма и должна использоваться только при необходимости.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow