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

SQL Server: как установить уровень изоляции по умолчанию для всей хранимой процедуры?

Если сразу после BEGIN у меня есть оператор SET TRANSACTION ISOLATION LEVEL ..., будет ли данный уровень транзакции действовать во всей области хранимой процедуры независимо от того, использую ли я BEGIN TRANSACTION или нет? А именно, если у меня есть простые операторы SELECT, которые являются атомарными/транслируются по определению, будет ли уровень транзакций по умолчанию для них установленным для данного?

BEGIN
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
 -- will a transaction level for a atomic transaction created by SQL Server for this statement be READ COMMITTED 
SELECT * FROM T
END
4b9b3361

Ответ 1

Во-первых, уровень изоляции по умолчанию в SQL Server - Read Committed, поэтому этот оператор действительно ничего не делает, если вы не изменили уровень изоляции по умолчанию.

Но, в общем, да, уровень изоляции транзакции SET изменит уровень изоляции для всей процедуры (на самом деле длительность соединения)

Имейте в виду, что все операторы SQL являются неявными транзакциями, что означает, что если, например, обновление не прошло 99%, он автоматически откатится; нет BEGIN TRAN/COMMIT.

Чтобы ответить на ваш вопрос, да, ваши операторы SELECT наследуют уровень изоляции, который вы установили (или по умолчанию, если вы его не задали), если вы не переопределите поведение с подсказкой запроса, например WITH NOLOCK, которая сделает индивидуальный запрос как будто вы сделали SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED