Подтвердить что ты не робот

Области уровня изоляции транзакций

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

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

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 

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

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

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

4b9b3361

Ответ 1

Выполните следующее и убедитесь сами:

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;

Ответ 2

Из MSDN

Если вы выбрали УРОВЕНЬ ИЗОЛЯЦИИ SET TRANSACTION в хранимой процедуре или триггер, когда объект возвращает управление уровнем изоляции resetдо уровня, действующего при вызове объекта. Например, если вы устанавливаете REPEATABLE READ в пакетном режиме, и затем пакет вызывается сохраненным процедура, которая устанавливает уровень изоляции SERIALIZABLE, изоляцию уровень настройки возвращается к REPEATABLE READ, когда хранимая процедура возвращает управление партии.

Ответ 3

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

Ответ 4

Из книг в строке

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

Ответ 5

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

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

Ответ 6

Чтобы получить более подробную информацию о уровнях изоляции в SQL Server, включая блокировки и ее влияние на базу данных в деталях с примерами, обратитесь к следующей ссылке: http://www.sqllion.com/2009/07/transaction-isolation-levels-in-sql-server/

Ответ 7

Обратите внимание, что существует проблема с областью действия 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