在我的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
这两个都做同样的事情。任何人都可以告诉他们是否存在任何差异或优势。
答案 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