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

SQL सर्वर - एक संग्रहीत कार्यविधि में नेस्टेड लेनदेन

SP2 द्वारा किए गए कार्य को वापस रोल करना और SP1 द्वारा किए गए कार्य को ढीला नहीं करना संभव है। लेकिन ऐसा होने के लिए, आपको अपवाद प्रबंधन और नेस्टेड लेनदेन :

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

सभी त्रुटियां पुनर्प्राप्त करने योग्य नहीं हैं, ऐसी कई त्रुटि स्थितियां हैं जिनसे लेन-देन पुनर्प्राप्त नहीं हो सकता है, सबसे स्पष्ट उदाहरण गतिरोध है (आपको डेडलॉक अपवाद के बारे में सूचित किया जाता है बाद लेनदेन पहले ही वापस लुढ़क चुका है)। SP1 और [email protected] दोनों इस पैटर्न का उपयोग करके लिखा जाना है। यदि आपके पास एक दुष्ट एसपी है, या आप मौजूदा संग्रहीत कार्यविधियों का सरल लाभ उठाना चाहते हैं, जो कि ROLLBACK जारी करते हैं बयान तो आपका कारण खो जाता है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. क्या प्रत्येक उपयोगकर्ता तालिका में क्लस्टर इंडेक्स होना चाहिए?

  2. एमएस-एक्सेस में अंतिम ऑटोइन्क्रिमेंटेड वैल्यू कैसे प्राप्त करें जैसे @@ एसक्यूएल सर्वर में पहचान

  3. SQL सर्वर एजेंट अलर्ट

  4. केवल SQL का उपयोग करके SQL सर्वर 2005 छवि फ़ील्ड में चित्र सम्मिलित करें

  5. गंभीर त्रुटि:C:\xampp\htdocs में अपरिभाषित फ़ंक्शन sqlsrv_connect () पर कॉल करें