在事务中使用显式提交

时间:2016-02-23 10:43:26

标签: sql sql-server transactions commit rollback

在我的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 

这两个都做同样的事情。任何人都可以告诉他们是否存在任何差异或优势。

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:-1)

隐式提交比显式提交慢,我们可以打开或关闭隐式取决于我们的要求,有关详细信息,您可以看到此链接:SQL Server – performance and other stories