2012-04-24 11 views
10

यदि कोई है तो इस लेनदेन को सम्मिलित/अद्यतन विफलताओं और रोलबैक के लिए परीक्षण करने का सही तरीका क्या है? मुझे नहीं लगता कि मेरे पास क्या काम आएगा क्योंकि मेरे आवेषण/अपडेट 3 अलग-अलग कथन हैं और @@ ROWCOUNT केवल अंतिम कथन को निष्पादित करेगा।एकाधिक प्रविष्टियों या अपडेट के आसपास लेनदेन का उपयोग करने का उचित तरीका

BEGIN TRANSACTION Script; 
GO 

INSERT INTO TableA (id) VALUES (1) 
INSERT INTO TableB (id) VALUES (1) 
UPDATE TableC SET id=1 WHERE id=2 
GO 

IF (@@ROWCOUNT=3 AND @@ERROR=0) 
    BEGIN 
    COMMIT 
    END 
ELSE 
    BEGIN 
    PRINT 'Error: Rolling back transaction' 
    ROLLBACK TRANSACTION Script 
    END 
GO 

उत्तर

33

यदि आप लेनदेन शुरू करने से पहले SET XACT_ABORT चालू करते हैं, तो in case of an error, rollback will be issued automatically

SET XACT_ABORT ON 

begin transaction 

INSERT INTO TableA (id) VALUES (1) 
INSERT INTO TableB (id) VALUES (1) 
UPDATE TableC SET id=1 WHERE id=2 

commit transaction 

आप अपने आप को रोलबैक करना चाहते हैं, use try .. catch block

begin transaction 

begin try 

    INSERT INTO TableA (id) VALUES (1) 
    INSERT INTO TableB (id) VALUES (1) 
    UPDATE TableC SET id=1 WHERE id=2 

    commit transaction 

end try 

begin catch 
    raiserror('Message here', 16, 1) 
    rollback transaction 
end catch 
+0

यह ठीक है, एक विफलता संदेश मुद्रण से मुझे को सीमित करता है? –

+0

@ जोपहिलिप्स कृपया मेरे अपडेट किए गए उत्तर की जांच करें। –

+1

लेन-देन रोलबैक के दौरान SET XACT_ABORT ऑन एट्रिब्यूट एक त्रुटि संदेश उठाएगा? – Raza

0

विफल आवेषण फेंक देंगे। @@ ROWCOUNT का उपयोग करके "विफल" अपडेट का पता लगाया जा सकता है।

2

मैं क्या संस्करण पर हैं, पता नहीं, लेकिन SQL 2005 के बाद से ट्राई/कैच कर दिया गया है:

begin transaction 
begin try 
    INSERT INTO TableA (id) VALUES (1) 
    INSERT INTO TableB (id) VALUES (1) 
    UPDATE TableC SET id=1 WHERE id=2 
end try 
begin catch 
    SELECT 
     ERROR_NUMBER() AS ErrorNumber, 
     ERROR_SEVERITY() AS ErrorSeverity, 
     ERROR_STATE() AS ErrorState, 
     ERROR_PROCEDURE() AS ErrorProcedure, 
     ERROR_LINE() AS ErrorLine, 
     ERROR_MESSAGE() AS ErrorMessage; 
    while(@@trancount > 0) 
    begin 
     rollback transaction 
    end 
end catch 
if (@@trancount <> 0) 
begin 
    commit transaction; 
end 
संबंधित मुद्दे