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

EXECUTE के बाद लेन-देन की संख्या BEGIN और COMMIT स्टेटमेंट की बेमेल संख्या को इंगित करती है। पिछली गणना =1, वर्तमान गणना =0

यदि आपके पास TRY/CATCH ब्लॉक है तो संभावित कारण यह है कि आप एक लेन-देन निरस्त अपवाद को पकड़ रहे हैं और जारी रखें। कैच ब्लॉक में आपको हमेशा XACT_STATE() और उचित निरस्त और अनुपयुक्त (बर्बाद) लेनदेन को संभालना। यदि आपका कॉलर लेन-देन शुरू करता है और कैली हिट करता है, कहते हैं, एक गतिरोध (जिसने लेन-देन को निरस्त कर दिया), तो कॉल करने वाला कॉलर से कैसे संवाद करेगा कि लेनदेन निरस्त कर दिया गया था और इसे 'हमेशा की तरह व्यवसाय' के साथ जारी नहीं रखना चाहिए? एकमात्र संभव तरीका अपवाद को फिर से उठाना है, जिससे कॉलर को स्थिति को संभालने के लिए मजबूर किया जा सके। यदि आप चुपचाप एक निरस्त लेनदेन को निगल लेते हैं और कॉलर यह मानता रहता है कि अभी भी मूल लेनदेन में है, तो केवल तबाही सुनिश्चित कर सकती है (और आपको जो त्रुटि मिलती है वह उसी तरह से है जैसे इंजन खुद को बचाने की कोशिश करता है)।

मेरा सुझाव है कि आप अपवाद प्रबंधन और नेस्टेड लेनदेन जो एक पैटर्न दिखाता है जिसका उपयोग नेस्टेड लेनदेन और अपवादों के साथ किया जा सकता है:

create procedure [usp_my_procedure_name]
as
begin
    set nocount on;
    declare @trancount int;
    set @trancount = @@trancount;
    begin try
        if @trancount = 0
            begin transaction
        else
            save transaction usp_my_procedure_name;

        -- Do the actual work here

lbexit:
        if @trancount = 0
            commit;
    end try
    begin catch
        declare @error int, @message varchar(4000), @xstate int;
        select @error = ERROR_NUMBER(), @message = ERROR_MESSAGE(), @xstate = XACT_STATE();
        if @xstate = -1
            rollback;
        if @xstate = 1 and @trancount = 0
            rollback
        if @xstate = 1 and @trancount > 0
            rollback transaction usp_my_procedure_name;

        raiserror ('usp_my_procedure_name: %d: %s', 16, 1, @error, @message) ;
    end catch
end
go


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. NVARCHAR(MAX) के लिए अधिकतम वर्ण क्या हैं?

  2. आप वीएस 2012 में अपने SQL सर्वर डेटाबेस प्रोजेक्ट में स्थिर डेटा कैसे संग्रहीत करते हैं

  3. तत्व मान के लिए SQL सर्वर क्वेरी xml विशेषता

  4. SQL सर्वर में तालिका नाम का नाम कैसे बदलें

  5. प्राथमिक कुंजी बाधा का उल्लंघन