0

识别事务错误的最优雅方法是什么?这时我的代码是这样的:

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

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

4

1 回答 1

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

于 2012-04-17T17:54:48.890 回答