在我的 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
这里两者都做同样的事情。任何人都可以告诉一个比另一个有什么区别或优势。
最佳答案
我可以看到的主要功能差异是,通过在第一个示例中使用显式 COMMIT,您可以确保表(在本例中为临时表)在最后为 SELECT 语句解锁。而在您的第二个示例中,SELECT 将被其他用户阻止,除非他们正在执行脏读(即 WITH (NOLOCK) 等),直到触发隐式 COMMIT。
由于您使用的是临时表,这不一定是什么大问题,但是如果您要将其更改为实际表,那么由于其上的开放 TRAN,该表被锁定的时间会有所不同。这意味着并发调用会阻塞更长时间并相互堆叠。或者在脏读的情况下,其他连接还不会看到您的更改。
显式关闭您在 SQL 中打开的任何 TRAN 也是一个很好的标准做法,这样您就不会依赖调用者来尝试提交 TRAN。请记住,如果与 SQL 的连接已关闭并且 TRAN 没有 COMMIT,则 TRAN 会自动获得 ROLLBACK。
关于sql - 在事务中使用显式提交,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35575287/