我按照推荐的模板来处理事务中的错误,该模板在现有事务中执行时应该可以工作。
这是我的模板
CREATE PROCEDURE DoSomething
AS
BEGIN
SET NOCOUNT ON
DECLARE @trans INTEGER = @@TRANCOUNT
IF (@trans > 0)
SAVE TRANSACTION SavePoint
ELSE
BEGIN TRANSACTION
BEGIN TRY
-- code with a check that does a THROW if the requirements aren't met
IF (@trans = 0)
COMMIT TRANSACTION
END TRY
BEGIN CATCH
IF (@trans > 0)
ROLLBACK TRANSACTION SavePoint
ELSE
ROLLBACK TRANSACTION
;THROW
END CATCH
END
如果我用 RAISERROR 替换 TRY 块中的 THROW,问题仍然存在。
试验结果:
事务中的执行失败场景:正确的结果(给出正确的错误消息)
事务中的 EXEC 成功场景:给出意外错误。
EXECUTE 之后的事务计数表明 BEGIN 和 COMMIT 语句的数量不匹配。先前计数 = 1,当前计数 = 2。
事务外的执行失败场景:给出预期的错误。
事务外的 EXEC 成功场景:出现意外错误。错误和上面一样,但是每次执行它都会增加-1。这是否意味着每次都有更多的东西未提交?
这是测试的样子:
BEGIN TRANSACTION
EXEC ...
ROLLBACK TRANSACTION
有谁知道出了什么问题?