GBNソリューションは私には機能しません。私はそれが他の場所で機能するとは思えません。
問題は、以前の分離レベルに戻ることは、EXECのコンテキスト内でのみ有効であるということです。私のスクリプトは以下のとおりです。現在の分離にスナップショットが含まれている場合も、分離を変更しようとしないことに注意してください。(試してみると失敗します)。
DECLARE @initalIsoloationLevel nvarchar(25)
SELECT @initalIsoloationLevel =
CASE
WHEN transaction_isolation_level = 1
THEN 'READ UNCOMMITTED'
WHEN transaction_isolation_level = 2
AND is_read_committed_snapshot_on = 1
THEN 'READ COMMITTED SNAPSHOT'
WHEN transaction_isolation_level = 2
AND is_read_committed_snapshot_on = 0
THEN 'READ COMMITTED'
WHEN transaction_isolation_level = 3
THEN 'REPEATABLE READ'
WHEN transaction_isolation_level = 4
THEN 'SERIALIZABLE'
WHEN transaction_isolation_level = 5
THEN 'SNAPSHOT'
ELSE NULL
END
FROM sys.dm_exec_sessions AS s
WHERE session_id = @@SPID
/* Changing isolation level is not supported with snapshots */
IF @initalIsoloationLevel NOT LIKE '%SNAP%' AND @initalIsoloationLevel is NOT NULL
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
/****** DO YOUR STUFF HERE ******/
/* Changing isolation level is not supported with snapshots */
IF @initalIsoloationLevel = 'READ COMMITTED'
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
ELSE IF @initalIsoloationLevel = 'REPEATABLE READ'
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
ELSE IF @initalIsoloationLevel = 'SERIALIZABLE'
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;