在我的事务中添加显式提交与自动提交有什么区别.
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.