यह हमारा टेम्प्लेट है (त्रुटि लॉगिंग हटा दी गई)
इसे संभालने के लिए डिज़ाइन किया गया है
- पॉल रैंडल का लेख "SQL सर्वर में नेस्टेड ट्रांजैक्शन जैसी कोई चीज नहीं है"
- त्रुटि 266
- ट्रिगर रोलबैक
स्पष्टीकरण:
-
सभी TXN प्रारंभ और प्रतिबद्ध/रोलबैक जोड़े जाने चाहिए ताकि
@@TRANCOUNT
प्रवेश और निकास पर समान है -
@@TRANCOUNT
. का बेमेल कारण त्रुटि 266 क्योंकि-
BEGIN TRAN
वेतन वृद्धि@@TRANCOUNT
-
COMMIT
कमी@@TRANCOUNT
-
ROLLBACK
रिटर्न@@TRANCOUNT
शून्य करने के लिए
-
-
आप
@@TRANCOUNT
. में कमी नहीं कर सकते वर्तमान दायरे के लिए
आपके विचार से यह "आंतरिक लेन-देन" है -
SET XACT_ABORT ON
बेमेल@@TRANCOUNT
. के कारण त्रुटि 266 को दबाता है
और यह "SQL Server Transaction Timeout" जैसी समस्याओं से भी निपटता है dba.se पर -
यह क्लाइंट साइड TXN (जैसे LINQ) के लिए अनुमति देता है एक एकल संग्रहीत प्रक्रिया वितरित या XA लेनदेन का हिस्सा हो सकती है, या क्लाइंट कोड में शुरू की गई एक प्रक्रिया हो सकती है (जैसे .net TransactionScope)
उपयोग:
- प्रत्येक संग्रहित खरीद को एक ही टेम्पलेट के अनुरूप होना चाहिए
सारांश
- इसलिए अपनी आवश्यकता से अधिक TXN न बनाएं
कोड
CREATE PROCEDURE [Name]
AS
SET XACT_ABORT, NOCOUNT ON
DECLARE @starttrancount int
BEGIN TRY
SELECT @starttrancount = @@TRANCOUNT
IF @starttrancount = 0
BEGIN TRANSACTION
[...Perform work, call nested procedures...]
IF @starttrancount = 0
COMMIT TRANSACTION
END TRY
BEGIN CATCH
IF XACT_STATE() <> 0 AND @starttrancount = 0
ROLLBACK TRANSACTION;
THROW;
--before SQL Server 2012 use
--RAISERROR [rethrow caught error using @ErrorNumber, @ErrorMessage, etc]
END CATCH
GO
नोट:
-
SET XACT_ABORT ON
. के कारण रोलबैक चेक वास्तव में बेमानी है . हालांकि, यह मुझे बेहतर महसूस कराता है, इसके बिना अजीब लगता है, और उन स्थितियों के लिए अनुमति देता है जहां आप इसे नहीं चाहते हैं -
Remus Rusanu एक समान शेल है जो सेव पॉइंट्स का उपयोग करता है। मैं एक परमाणु डीबी कॉल पसंद करता हूं और उनके लेख जैसे आंशिक अपडेट का उपयोग नहीं करता