检测到事务中的错误,而不仅仅是上次操作错误

时间:2012-04-17 17:50:10

标签: tsql sql-server-2008-r2

在交易中识别错误的最优雅方法是什么?这时我的代码就像:

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

这只捕获上一次操作错误,在这种情况下插入错误但不是第一次操作错误,在我的情况下,更新错误。如何改进我的代码?

1 个答案:

答案 0 :(得分: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中尝试所有操作。

另外你应该看看Erland Sommarskog关于错误处理的圣经:

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