在交易中识别错误的最优雅方法是什么?这时我的代码就像:
begin transaction tx1
update ....
insert ....
if @@error = 0
commit
else
rollback
end
这只捕获上一次操作错误,在这种情况下插入错误但不是第一次操作错误,在我的情况下,更新错误。如何改进我的代码?
答案 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关于错误处理的圣经: