2012-04-24 24 views
10

Cách thích hợp để kiểm tra lỗi chèn/cập nhật là gì và khôi phục giao dịch này nếu có? Tôi không nghĩ rằng những gì tôi có sẽ làm việc kể từ khi chèn/cập nhật của tôi là 3 báo cáo riêng biệt và @@ ROWCOUNT sẽ chỉ phản ánh tuyên bố cuối cùng được thực hiện.Cách thích hợp để sử dụng giao dịch xung quanh nhiều lần chèn hoặc cập nhật

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 

Trả lời

33

Nếu bạn đặt SET XACT_ABORT ON trước khi bắt đầu giao dịch, 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 

Nếu bạn muốn tự mình quay lại, 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

Điều này hạn chế cho tôi từ in một thông báo lỗi, phải không? –

+0

@JoePhilllips vui lòng kiểm tra câu trả lời cập nhật của tôi. –

+1

thuộc tính SET XACT_ABORT ON có làm tăng thông báo lỗi khi giao dịch quay lại không? – Raza

0

Không chèn sẽ ném. Không thể phát hiện các cập nhật "Không" bằng @@ ROWCOUNT.

2

Tôi không biết những gì phiên bản bạn đang ở trên, nhưng đã có try/catch từ 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 
Các vấn đề liên quan