繁体   English   中英

Sql Server - 更新语句在回滚事务后立即执行时锁定表

[英]Sql Server - Update Statement is locking the table when executed immediately after Rollback Transaction

我在我的程序中使用了带有 try-catch 块的事务。 如果发生任何异常,我将回滚事务,然后尝试更新结果(状态)表。 但是,看起来 Update 语句正在锁定表(此后该表上的 Select 查询不起作用)。

你能告诉我这种行为的原因是什么吗?

这是我的示例代码:

ALTER PROCEDURE Test_Tran
AS
BEGIN
    BEGIN TRY
        BEGIN TRANSACTION
            SAVE TRANSACTION T1;
            SELECT 1 / 0;
        COMMIT TRANSACTION
    END TRY
    BEGIN CATCH
        ROLLBACK TRANSACTION T1;
        UPDATE [DI].[BOMLC_AMPL_DI_Async_Exec_Results]
            SET
                [End_Time] = GETDATE(),
                [Execution_Status] = 'FAILED',
                [Error_Number] = 16,
                [Error_Message] = 'Exception occurred while processing: '
                                    + ERROR_MESSAGE(),

                [Last_Updated_On] = GETDATE()

            WHERE [Token_ID] = 52;
        PRINT('Something went wrong');
    END CATCH

END
GO

EXEC Test_Tran;

UPDATE语句后添加COMMITROLLBACK 或者做ROLLBACK TRANSACTION而不是ROLLBACK TRANSACTION T1

解释:

保存点会导致问题。 发生错误时,您正在回滚到保存点,但事务仍处于打开状态。 您还会收到关于 trancount 不匹配的错误。 更新是在从未提交的事务中完成的,因此锁定。 当程序结束时,交易仍处于打开状态。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM