2012-05-24 28 views
5

Tôi nhận được lỗi "Yêu cầu GIAO DỊCH ROLLBACK không có tương tác BEGIN GIAO DỊCH tương ứng". Tôi đang cố gắng khôi phục giao dịch nếu số hàng cho bất kỳ tuyên bố xóa nào bằng không. Đưa ra dưới đây là mã của tôi. Tôi đang làm gì sai? Vui lòng giúpYêu cầu giao dịch ROLLBACK không có lỗi GIAO DỊCH BEGIN tương ứng trong máy chủ sql

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 

Trả lời

5

Nếu bạn cam kết giao dịch, bạn không thể thực hiện khôi phục. Thực hiện một hay cách khác:

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

Tại sao downvote? Nếu bạn không giải thích những gì bạn nghĩ là sai, nó không thể cải thiện câu trả lời. – Guffa

4

Bạn có commit transaction trans1 ngay trước khi câu lệnh if rollback. Giao dịch sẽ luôn được cam kết trước khi bạn kiểm tra số lượng.

1

Tôi tin rằng commit transaction trans1 luôn bị ảnh hưởng, do đó bạn sẽ không thể quay trở lại từ thời điểm đó.

1

Điều này xảy ra nếu giao dịch của bạn đã được cam kết trước khi bạn thực sự đi vào cam kết tuyên bố của bạn. Bạn có thể đưa ra điều kiện 'If (@@ TRANCOUNT> 0)' trước khi tuyên bố 'GIAO DỊCH GIAO DỊCH'.

Đối với Ví dụ:

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

HOẶC

BEGIN TRY 
    BEGIN TRANSACTION 
    SELECT 0 --Statements To Excecute  
    COMMIT TRANSACTION 
    END TRY 
    BEGIN CATCH 
    IF(@@TRANCOUNT>0) 
    ROLLBACK 
    END CATCH 
Các vấn đề liên quan