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