2011-01-07 10 views
10

शायद मैं लेनदेन के बारे में कुछ है या क्या गलत कर रहा हूँ एसक्यूएल सर्वर कर लेकिन निम्नलिखित T-SQL पर विचार किया जाता है: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? 

शायद यह कोई फर्क नहीं पड़ता, लेकिन मैं गर्म फजी लग रहा है कि मैं जा रहा हूँ की तरह चीजें जिस तरह से वे एक बार कर रहे थे मैं कर रहा हूँ जो मैं कर रहा हूँ। क्या राज्य पहले क्या था, इस पर ध्यान दिए बिना अलगाव स्तर को मूल स्थिति में रीसेट करना संभव है?

उत्तर

12

अपने कोड एक संग्रहीत प्रक्रिया के अंदर निष्पादित किया जाता है, तो परिवर्तन केवल संग्रहीत proc के दायरे के दौरान लागू होता है - जब संग्रहीत proc रिटर्न, कनेक्शन स्वचालित रूप से इसे में वापस आ जाएगा के लिए अलगाव स्तर पिछले स्तर है:

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 अलगाव स्तर के रूप में)।

+0

मेरा कोड एक संग्रहित प्रो में समाप्त हुआ ताकि यह जानना अच्छा हो। धन्यवाद! – DJTripleThreat

+0

@Damien_The_Unbeliever क्या यह ट्रिगर्स पर भी लागू होता है? –

+0

@SpongebobComrade - हाँ - ['सेट ट्रांज़ेक्शन इशोलेशन लेवल '] (https://msdn.microsoft.com/en-GB/library/ms173763.aspx):" यदि आप एक संग्रहीत प्रक्रिया या ट्रिगर में सेट ट्रांज़ेक्शन इशोलेशन लेवल जारी करते हैं , जब वस्तु नियंत्रण वापस आती है तो अलगाव स्तर को तब लागू किया जाता है जब वस्तु को लागू किया गया था " –

14

आप बैचों को पार करने वाली है, तो SET CONTEXT_INFO का उपयोग मूल्य जो भी बाद में sys.dm_exec_sessions से पढ़ा जा सकता संरक्षित करने के लिए की जरूरत है से sys.dm_exec_sessions.transaction_isolation_level

मौजूदा स्तर पता है।

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) 
+0

+1। वास्तव में उपयोगी चीजें! इसे पोस्ट करने के लिए धन्यवाद। – DJTripleThreat

1

जीबीएनएस समाधान मेरे लिए काम नहीं करता है। मुझे संदेह है कि यह कहीं और काम करेगा।

समस्या यह है कि पिछले अलगाव स्तर पर वापस केवल 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; 
संबंधित मुद्दे