sql – 在事务中使用显式提交

在我的事务中添加显式提交与自动提交有什么区别.

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,这也是一个很好的标准做法,这样您就不会依赖调用者来尝试COMMIT.请记住,如果关闭SQL的连接并且TRAN没有COMMIT,则TRAN会自动获得ROLLBACK.

点赞