Области уровня изоляции транзакции - PullRequest
40 голосов
/ 25 июня 2009

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

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

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 

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

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

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

Ответы [ 6 ]

36 голосов
/ 26 июня 2009

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

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;
16 голосов
/ 06 февраля 2014

С MSDN

Если вы запускаете SET TRANSACTION ISOLATION LEVEL в хранимой процедуре или триггере, когда объект возвращает управление, уровень изоляции сбрасывается до уровня, действующего при вызове объекта .Например, если вы установили REPEATABLE READ в пакете, а затем пакет вызывает хранимую процедуру, которая устанавливает уровень изоляции SERIALIZABLE, параметр уровня изоляции возвращается к REPEATABLE READ, когда хранимая процедура возвращает управление пакету.

14 голосов
/ 25 июня 2009

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

4 голосов
/ 25 июня 2009

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

только одна из транзакций изоляции Параметры УРОВНЯ могут быть установлены одновременно, и он остается установленным для этого соединения пока это явно не изменилось. это становится поведением по умолчанию, если только Опция оптимизации указана в уровень таблицы в предложении FROM заявление.

2 голосов
/ 25 июня 2009

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

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

0 голосов
/ 22 декабря 2015

Обратите внимание, что существует проблема с областью действия TRANSACTION LEVELS и SqlServer 2012 или более ранней версии, когда используется высокопроизводительный пул соединений ADO.NET, где это может фактически сохраняться при закрытии соединения:

SQL Server: утечка уровня изоляции через пул соединений

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

...