2012-05-24 16 views
5

में कोई संबंधित BEGIN ट्रांज़ेक्शन त्रुटि नहीं है मुझे त्रुटि मिल रही है "रोलबैक ट्रांज़ेक्शन अनुरोध में कोई संबंधित BEGIN ट्रांज़ेक्शन नहीं है"। यदि किसी भी डिलीट कथन के लिए पंक्ति गणना शून्य है तो मैं लेनदेन को रोलबैक करने की कोशिश कर रहा हूं। नीचे दिया गया मेरा कोड है। मैं क्या गलत कर रहा हूं? कृपयारोलबैक ट्रांज़ेक्शन अनुरोध में एसक्यूएल सर्वर

alter procedure delete_staff(@staffID varchar(10)) 
as 
declare @tempvar varchar(50), @staffName varchar(50), @jobTitle varchar(50), @dept varchar(50) 
begin transaction trans1 
     declare @rc1 int 
     declare @rc2 int 
     declare @rc3 int 
     select @tempvar = left(@staffID,1) from Staff 
     delete from staff where staffID = @staffID 
     set @[email protected]@rowcount 
     delete from Login where userID = @staffID 
     set @[email protected]@rowcount 
     begin 
     if(@tempvar='S') 
       begin 
       delete from Specialist where specialistID = @staffID  
       set @[email protected]@rowcount 
       end 
     else if(@tempvar='H') 
       begin 
       delete from Helpdesk_Operator where helpdesk_OperatorID = @staffID 
       set @[email protected]@rowcount 
       end 
     commit transaction trans1 
     end 
     if(@rc1=0 or @rc2=0 or @rc3=0) 
     begin 
     rollback transaction trans1 
     end 

उत्तर

5

यदि आप लेनदेन करते हैं, तो आप रोलबैक नहीं कर सकते हैं। एक या दूसरे को करें:

if(@rc1=0 or @rc2=0 or @rc3=0) 
begin 
    rollback transaction trans1 
end else begin 
    commit transaction trans1 
end 
+0

क्यों downvote? यदि आप जो भी सोचते हैं वह गलत नहीं है, तो यह उत्तर में सुधार नहीं कर सकता है। – Guffa

4

आपके पास रोलबैक के लिए आपके कथन के ठीक पहले commit transaction trans1 है। गणना की जांच करने से पहले लेनदेन हमेशा किया जाएगा।

1

मेरा मानना ​​है कि commit transaction trans1 हमेशा हिट हो रहा है, इसलिए आप उस बिंदु से रोलबैक करने में असमर्थ होंगे।

1

ऐसा होता है यदि वास्तव में आपके प्रतिबद्धता वक्तव्य में जाने से पहले आपका लेनदेन पहले ही किया जा चुका है। आप 'COMMIT ट्रांज़ेक्शन' स्टेटमेंट से पहले 'अगर (@@ TRANCOUNT> 0)' शर्त दे सकते हैं।

उदाहरण के लिए:

BEGIN TRANSACTION 
    SELECT 0--Statements To Excecute 
    ROLLBACK 
    IF(@@TRANCOUNT>0) 
    COMMIT TRANSACTION 

या

BEGIN TRY 
    BEGIN TRANSACTION 
    SELECT 0 --Statements To Excecute  
    COMMIT TRANSACTION 
    END TRY 
    BEGIN CATCH 
    IF(@@TRANCOUNT>0) 
    ROLLBACK 
    END CATCH 
संबंधित मुद्दे