【发布时间】:2014-09-28 13:52:33
【问题描述】:
我正在尝试编写一个包含事务和 try/catch 块的 MS sql 脚本。如果它捕获到异常,则回滚事务。如果不是,则提交事务。我看到一些不同的网站说要这样做:
begin transaction
begin try
--main content of script here
end try
begin catch
rollback transaction
end catch
commit transaction
但是即使在捕获异常的情况下,我们是否仍会点击“提交事务”行?这不会因为事务已经回滚而导致 SQL 错误吗?我认为应该这样做:
declare @success bit = 1
begin transaction
begin try
--main content of script here
end try
begin catch
rollback transaction
set @success = 0
end catch
if(@success = 1)
begin
commit transaction
end
为什么常见的解决方案不包含@success 变量?提交已回滚的事务是否不会发生 sql 错误?我是否说第一个代码示例的“提交事务”行在捕获异常的情况下仍然会被命中?
【问题讨论】:
-
我实际上不会做这两件事。我会将提交移到 TRY 块内。不需要像您发布的其他变量。这是 TRY/CATCH 的一大优势,我们可以摆脱变量的意大利面,并在所有地方检查它们。
-
我同意 Sean 的方法,但要确定它是否会在提交事务时导致 SQL 错误,最简单的方法是尝试一下。如果它是最被接受的方法,它可能不会。
标签: sql sql-server exception transactions try-catch