2012-04-17 22 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

相关问题