2012-04-24 13 views
10

Hatalar ekleme/güncelleştirme sınamanın ve bu işlemi geri alma işleminin doğru yolu nedir? Eklerim/güncellemelerim 3 ayrı deyim olduğundan ve @@ ROWCOUNT yalnızca son ifadeyi yansıtacağından beri ne yapacağımı düşünmüyorum.Bir işlemin birden çok ek veya güncelleştirme etrafında kullanılmasının doğru yolu

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 

cevap

33

İşlemi başlamadan önce SET XACT_ABORT ON koyarsanız, 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 

kendini geri alma yapmak istiyorsanız

, 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

Bu hak, bir başarısızlık mesajı yazdırmadan beni sınırlar? –

+0

@JoePhilllips Lütfen güncellenmiş yanıtımı kontrol edin. –

+1

SET XACT_ABORT ON özniteliği, işlem geri döndüğünde bir hata iletisi verir mi? – Raza

0

Arızalı ekler atılacaktır. "Başarısız" güncellemeler @@ ROWCOUNT kullanılarak tespit edilebilir.

2

Ben sende hangi sürümü bilmiyorum ama SQL 2005 yılından bu yana deneme/yakalama olmuştur:

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