【问题标题】:Do I need to call rollback if I never commit?如果我从不提交,是否需要调用回滚?
【发布时间】:2011-12-19 18:58:33
【问题描述】:

我正在使用不自动提交连接到 SQL Server。如果一切顺利,我调用 commit。否则,我就退出。是否需要显式调用回滚,还是会在我们关闭连接而不提交时自动回滚?

以防万一,我在 SAS 的 proc sql 中执行 SQL 命令。

更新:如果不调用回滚,SAS 可能会在 proc sql 块的末尾自动调用 commit。所以在这种情况下,回滚不仅仅是一种好的做法。这将是必要的。

最终更新:我们最终切换到了一个新系统,在我看来,它的行为与我们之前的相反。在没有指定提交或回滚的情况下结束事务,它将回滚。所以,下面给出的建议绝对是正确的:总是明确地提交或回滚。

【问题讨论】:

    标签: sql sql-server transactions sas


    【解决方案1】:

    应该在连接关闭时回滚。强调应该是有原因的:-)

    正确的事务和错误处理应该让您始终在满足提交条件时提交,在不满足时回滚。我认为完成后始终提交或回滚而不依赖断开/等是一个好习惯。只需一个错误或不正确/未关闭会话即可为所有人创建阻塞链噩梦:-)

    【讨论】:

    • 连接池对此有何影响?
    • 如果您在管理交易时考虑到了最佳实践,您不必担心,@JoeStefanelli :-) 我的意思是 - 1.) 尽可能快地进出您的交易 -只在其中做必要的事情以保持占用空间和影响较小以及 2.) 正确的错误处理和清理以在正确完成时提交,在不正确时回滚。如果我管理的环境违反了这两个基本原则,我将不会批准它。所以连接池不会在那里产生影响。
    • 同意最好在事情正确完成时进行自己的显式提交。我的问题更多地针对您答案的“应该在关闭连接时回滚”部分。
    • 我应该澄清一下。是的 - 在会话连接正确关闭时,事务将回滚。您可以验证在 SSMS 中播放是否足够容易。创建一个表,向其中插入一个值并以隐式事务模式将其全部提交。然后插入一个值,不要提交。打开一个新连接并查询默认隔离级别的表,它将被阻塞。强行断开第一个会话,第二个查询只返回那个原始的、已提交的行。回滚发生了。所以它会,但如果你没有正确关闭该会话,它不会。
    • 如果你有一个没有回滚路径的提交语句,你最好永远不要让我审查你的代码。 try catch 块的存在是有原因的。每当您有一个显式事务时,您都需要提交和回滚以防出错。
    猜你喜欢
    • 2012-07-10
    • 1970-01-01
    • 2022-11-10
    • 1970-01-01
    • 2017-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-10
    相关资源
    最近更新 更多