0

我按照推荐的模板来处理事务中的错误,该模板在现有事务中执行时应该可以工作。

这是我的模板

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

有谁知道出了什么问题?

4

1 回答 1

0

取消注释 var

CREATE PROCEDURE DoSomething
AS
BEGIN
SET NOCOUNT ON
DECLARE @trans INTEGER = @@TRANCOUNT

IF (@trans > 0)
    SAVE TRANSACTION SavePoint
ELSE
    BEGIN TRANSACTION

BEGIN TRY
    DECLARE @f float;
    SET @f = 0;
    --var 1.
    --print  1/0
    --var 2.
    print LOG(@f)     
    --var ok
    --print 'ok'
END TRY

BEGIN CATCH             
    IF (@trans > 0 AND XACT_STATE() <> -1)
    BEGIN
        PRINT 'ROLLBACK SavePoint'
        ROLLBACK TRANSACTION SavePoint
    END
    PRINT 'Error'
END CATCH
END

并执行

BEGIN TRANSACTION   
EXEC DoSomething 

IF XACT_STATE() = -1      
BEGIN   
    PRINT 'ROLLBACK XACT'
    ROLLBACK 
END

IF @@TRANCOUNT > 0 
BEGIN
    PRINT 'COMMIT'
    COMMIT 
END
于 2017-10-11T11:58:49.720 回答