2012-04-17 26 views
0

什麼是識別事務錯誤的最優雅的方式?這時我的代碼是這樣的:檢測到事務中的錯誤,而不僅僅是上次操作錯誤

begin transaction tx1 
update .... 
insert .... 
if @@error = 0 
    commit 
else 
    rollback 
end 

這唯一的缺點最後的操作錯誤,在插入這種情況下錯誤,但不是第一次操作錯誤,在我的情況,更新錯誤。我如何改進我的代碼?

回答

4

你看過嗎TRY/CATCH

http://msdn.microsoft.com/en-us/library/ms175976.aspx

當然,你仍然只能趕上送你到CATCH如果你這樣做的第一個錯誤:

BEGIN TRANSACTION; -- not sure why you're using a named transaction 

BEGIN TRY 
    UPDATE ... 
    INSERT ... 
    COMMIT TRANSACTION; 
END TRY 
BEGIN CATCH 
    PRINT ERROR_MESSAGE(); 
    ROLLBACK TRANSACTION; 
END CATCH 

但是你可以在每個包裹的操作擁有TRY/CATCH,例如

BEGIN TRANSACTION; -- still not sure why you're using a named transaction 

BEGIN TRY 
    UPDATE ... 
    COMMIT TRANSACTION; 
END TRY 
BEGIN CATCH 
    PRINT ERROR_MESSAGE(); 
    ROLLBACK TRANSACTION; 
END CATCH 

BEGIN TRANSACTION; 

BEGIN TRY 
    INSERT ... 
    COMMIT TRANSACTION; 
END TRY 
BEGIN CATCH 
    PRINT ERROR_MESSAGE(); 
    ROLLBACK TRANSACTION; 
END CATCH 

但是我不確定你想在這裏遵循什麼規則......如果更新失敗,你希望插入成功嗎?如果你想要所有的行動成功或失敗作爲一個組,那麼你想要第一個方法,在一個TRY一切嘗試。

你也應該看看厄蘭Sommarskog的聖經上的錯誤處理:

http://www.sommarskog.se/error_handling_2005.html

相關問題