【发布时间】:2016-09-01 16:58:57
【问题描述】:
我是一名 C# 开发人员,学习更多 TSQL。我写了一个这样的脚本:
begin transaction
--Insert into several tables
end transaction
但有人告诉我这不是一个好主意并使用这样的东西:
BEGIN TRANSACTION;
BEGIN TRY
-- Generate a constraint violation error.
DELETE FROM Production.Product
WHERE ProductID = 980;
END TRY
BEGIN CATCH
SELECT
ERROR_NUMBER() AS ErrorNumber
,ERROR_SEVERITY() AS ErrorSeverity
,ERROR_STATE() AS ErrorState
,ERROR_PROCEDURE() AS ErrorProcedure
,ERROR_LINE() AS ErrorLine
,ERROR_MESSAGE() AS ErrorMessage;
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION;
END CATCH;
IF @@TRANCOUNT > 0
COMMIT TRANSACTION;
GO
我不明白为什么第二个例子更正确。第一个不会以同样的方式工作吗?似乎第一个要么更新所有表,要么根本不更新?我不明白为什么在提交之前检查@@TRANCOUNT 是必要的。
【问题讨论】:
-
我会提出与您相同的论点。此外,向您推荐的 try/catch 模式是我称之为 try/squelch 的反模式。它捕获并出错,然后静默进行。那不是处理错误,而是抑制错误。也就是说,事务不需要 try/catch 块。尤其是当您处于触发器中时,使用 try/catch 可能会导致比它所解决的问题更多的问题。
-
如果在第二个示例中有任何内容,提交应该在 try 块中,而不是在 catch 之后......我认为
标签: sql-server tsql