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

标签 sql sql-server transactions commit rollback

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

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/

相关文章:

c++ - 查询的SQL格式

sql - postgres 中的 num_rows 总是返回 1

php - 具有特定日期的行数

Spring,休眠与谷歌应用引擎

java - 回滚不起作用

MySQL 多字段索引

sql - 根据他们在 SQL Server 中的成就显示名称

c# - 受此声明影响的记录数

sql-server - 在不同编码的 SQL Server 中搜索波斯语字符和单词

sql-server - 调用 BEGIN TRANS 而不是 COMMIT、ROLLBACK 或 END TRANS 时的结果是什么?