Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

TRY CATCH ROLLBACK पैटर्न वाली नेस्टेड संग्रहीत कार्यविधियाँ?

यह हमारा टेम्प्लेट है (त्रुटि लॉगिंग हटा दी गई)

इसे संभालने के लिए डिज़ाइन किया गया है

स्पष्टीकरण:

  • सभी 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 एक समान शेल है जो सेव पॉइंट्स का उपयोग करता है। मैं एक परमाणु डीबी कॉल पसंद करता हूं और उनके लेख जैसे आंशिक अपडेट का उपयोग नहीं करता



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL-सर्वर:त्रुटि - विशेष पहुँच प्राप्त नहीं की जा सकी क्योंकि डेटाबेस उपयोग में है

  2. SQL सर्वर डेटाबेस में प्राथमिक कुंजी बाधा वाले सभी टेबल कैसे प्राप्त करें - SQL सर्वर / TSQL ट्यूटोरियल 57

  3. स्ट्रिंग के लिए कास्टिंग टाइप किए बिना एक्सएमएल को संयोजित करें

  4. डीडी से समय कैसे प्रारूपित करें:एचएच:मिमी:एसएस से केवल एचएच:मिमी:एसएस एसक्यूएल सर्वर में?

  5. टेक्स्ट कॉलम केवल 4096 बाइट क्यों लौटाता है?