在我的 explicit commit 中添加 transaction 与自动提交有什么区别。

CREATE TABLE #test (test_col INT)

使用显式 COMMIT
INSERT #test
VALUES (11)

BEGIN TRY
    BEGIN TRAN DELETE_TRAN

    DELETE FROM #test

    COMMIT TRAN DELETE_TRAN
END TRY

BEGIN CATCH
    ROLLBACK TRAN DELETE_TRAN

    SELECT ERRORMESSAGE = Error_message()
END CATCH

SELECT *
FROM   #test

没有明确的 COMMIT
INSERT #test
VALUES (11)

BEGIN TRY
    BEGIN TRAN DELETE_TRAN

    DELETE FROM #test
END TRY

BEGIN CATCH
    ROLLBACK TRAN DELETE_TRAN

    SELECT ERRORMESSAGE = Error_message()
END CATCH

SELECT *
FROM   #test

这里两者都做同样的事情。任何人都可以告诉一个比另一个有什么区别或优势。

最佳答案

我可以看到的主要功能差异是,通过在第一个示例中使用显式 COMMIT,您可以确保表(在本例中为临时表)在最后为 SELECT 语句解锁。而在您的第二个示例中,SELECT 将被其他用户阻止,除非他们正在执行脏读(即 WITH (NOLOCK) 等),直到触发隐式 COMMIT。

由于您使用的是临时表,这不一定是什么大问题,但是如果您要将其更改为实际表,那​​么由于其上的开放 TRAN,该表被锁定的时间会有所不同。这意味着并发调用会阻塞更长时间并相互堆叠。或者在脏读的情况下,其他连接还不会看到您的更改。

显式关闭您在 SQL 中打开的任何 TRAN 也是一个很好的标准做法,这样您就不会依赖调用者来尝试提交 TRAN。请记住,如果与 SQL 的连接已关闭并且 TRAN 没有 COMMIT,则 TRAN 会自动获得 ROLLBACK。

关于sql - 在事务中使用显式提交,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35575287/

10-12 18:39