Вопрос

Каковы правила определения области действия для уровней изоляции транзакций в SQL Server 2005?Я знаю, что означают разные уровни, но не знаю, как правильно применять их за пределами запускаемого вручную скрипта.Я не могу найти руководство для практического использования в коде производственного качества.

Очевидно, что область действия начинается, когда вы используете команду, подобную этой:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 

Но где же это заканчивается?Если я устанавливаю уровень iso в хранимой процедуре, а затем этот процесс вызывает другой, наследует ли вложенный процесс его?Еще лучше, если я повышу уровень iso внутри вложенной процедуры, будет ли это перенесено обратно в вызывающую процедуру?Имеют ли какие-либо различия команды транзакции, такие как BEGIN TRAN, ROLLBACK и COMMIT?

Когда сохраненная процедура вызывается приложением или заданием агента, сохраняются ли каким-либо образом изменения уровня изоляции?Всегда ли я должен возвращаться к чтению по умолчанию, ЗАФИКСИРОВАННОМУ в конце каждой процедуры?

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

Это было полезно?

Решение

Запустите следующее и убедитесь сами:

CREATE PROCEDURE dbo.KeepsIsolation
AS
BEGIN
PRINT 'Inside sproc that does not change isolation level';
DBCC USEROPTIONS;
END
GO

CREATE PROCEDURE dbo.ChangesIsolation
AS
BEGIN
PRINT 'Inside sproc that changes isolation level';
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
DBCC USEROPTIONS;
END
GO
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
DBCC USEROPTIONS;
EXEC dbo.KeepsIsolation;
DBCC USEROPTIONS;
EXEC dbo.ChangesIsolation;
-- demonstrates that isolation level restored to REPEATABLE READ after exiting the procedure
    DBCC USEROPTIONS;

Другие советы

От MSDN

Если вы выдаете УСТАНОВЛЕННЫЙ УРОВЕНЬ ИЗОЛЯЦИИ ТРАНЗАКЦИИ в хранимой процедуре или триггер, когда объект возвращает управление уровнем изоляции сбрасывается до уровня, действовавшего при вызове объекта.Например, если вы задаете ПОВТОРЯЕМОЕ ЧТЕНИЕ в пакете, а пакет затем вызывает хранимую процедуру, которая устанавливает уровень изоляции на СЕРИАЛИЗУЕМЫЙ, настройка уровня изоляции возвращается к ПОВТОРЯЕМОМУ чтению, когда хранимая процедура возвращает управление пакету.

DBCC USEROPTIONS отобразит текущий уровень изоляции вместе со всеми другими установленными параметрами.

Из книг онлайн

Только один из параметров УРОВНЯ ИЗОЛЯЦИИ ТРАНЗАКЦИИ Одновременно может быть установлен параметр УРОВНЯ, и он остается установленным для этого соединения до тех пор, пока он не будет явно изменен.Это становится поведением по умолчанию, если только параметр оптимизации не указан на уровне таблицы в предложении FROM инструкции .

Уровень изоляции не выполняет откат вместе с транзакцией.

Уровень изоляции остается актуальным, даже если вы вызываете процедуры и функции.

Пожалуйста, обратите внимание, что существует проблема с областью действия УРОВНЕЙ ТРАНЗАКЦИЙ и SQLServer 2012 или более ранней версии при высокой производительности ADO.NET Используется пул соединений, где это может фактически сохраняться после закрытия соединения:

SQL Сервер:Утечки уровня изоляции между объединенными соединениями

https://social.msdn.microsoft.com/Forums/sqlserver/en-US/916b3d8a-c464-4ad5-8901-6f845a2a3447/sql-server-2014-reseting-isolation-level?forum=sqldatabaseengine

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top