15

トランザクションやSQLServerの動作について誤解しているかもしれませんが、次のT-SQLを検討してください。

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
GO

BEGIN TRANSACTION

-- DO SOME READS AND OTHER THINGS

COMMIT

-- OK, WHAT HAPPENS TO THE ISOLATION LEVEL AFTER THIS?

たぶんそれは問題ではないかもしれませんが、私がやっていることをやった後は、物事をそのままにしておくという温かいファジーな感じが好きです。以前の状態に関係なく、分離レベルを元の状態にリセットすることは可能ですか?

4

3 に答える 3

18

コードがストアドプロシージャ内で実行される場合、変更はストアドプロシージャのスコープ内でのみ適用されます。ストアドプロシージャが戻ると、接続の分離レベルは自動的に以前のレベルに戻ります。

create procedure dbo.IsoTest
as
    set transaction isolation level serializable
    begin transaction

    select transaction_isolation_level FROM sys.dm_exec_sessions where session_id = @@SPID

    select object_id from sys.objects

    commit
go
select transaction_isolation_level FROM sys.dm_exec_sessions where session_id = @@SPID
exec dbo.IsoTest
select transaction_isolation_level FROM sys.dm_exec_sessions where session_id = @@SPID

(sys.objectsからの結果セットを無視すると、分離レベルとして2、4、および2が出力されます)。

于 2011-01-08T11:58:29.287 に答える
15

あなたはから現在のレベルを知っていますsys.dm_exec_sessions.transaction_isolation_level

バッチをスパンする必要がある場合は、を使用SET CONTEXT_INFOして値を保持します。この値は、後でsys.dm_exec_sessionsから読み取ることもできます。

DECLARE @CurrentIsolationLevel smallint

SELECT @CurrentIsolationLevel = transaction_isolation_level
FROM sys.dm_exec_sessions
WHERE session_id = @@SPID

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
BEGIN TRANSACTION
-- DO SOME READS AND OTHER THINGS
COMMIT

DECLARE @SQL varchar(200)
SELECT @SQL = 'SET TRANSACTION ISOLATION LEVEL ' +
       CASE  @CurrentIsolationLevel
           WHEN 1 THEN 'READ UNCOMMITTED'
           WHEN 2 THEN 'READ COMMITTED'
           WHEN 3 THEN 'REPEATABLE READ'
           WHEN 4 THEN 'SERIALIZABLE'
           WHEN 5 THEN 'SNAPSHOT'
       END
EXEC (@sql)
于 2011-01-08T10:25:56.720 に答える
2

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;
于 2016-10-26T19:30:36.873 に答える