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