如果我从未提交,是否需要调用回滚函数?

23

我正在使用无需自动提交的方式连接到SQL Server,如果一切成功,我会调用commit。否则,我就退出了。我需要显式调用rollback,还是在没有提交的情况下关闭连接时它会自动回滚?

如果有影响的话,我是在SAS的proc sql中执行SQL命令。

更新:看起来SAS可能会在未调用rollback时自动在proc sql块结束时提交。因此,在这种情况下,rollback不仅是良好的实践,而且是必要的。

最终更新:我们最终切换到了一个新系统,我认为它与我们之前的系统表现相反。在结束事务而没有指定提交或回滚时,它会回滚。因此,下面给出的建议是正确的:始终显式地提交或回滚。

1个回答

12

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

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


1
连接池对此会产生什么影响? - Joe Stefanelli
如果您在管理交易时遵循最佳实践,就不必担心,@JoeStefanelli :-) 我的意思是 - 1.) 尽可能快地进出您的交易 - 只做必要的事情,以保持足迹和影响小,并且 2.) 正确处理错误并清理以在正确完成时提交,否则回滚。如果违反这两个基本原则,我不会批准我管理的环境中的更改。因此,连接池对此没有影响。 - Mike Walsh
1
我应该澄清一下。是的,在会话连接正确关闭时,事务将回滚。您可以在 SSMS 中轻松验证。创建一个表,在隐式事务模式下插入一个值并提交所有内容。然后插入一个值,不要提交它。使用默认隔离级别打开一个新连接并查询表,它将被阻止。强制断开第一个会话,第二个查询仅返回原始提交的行。回滚发生了。但是,如果您没有正确关闭该会话,则不会发生回滚。 - Mike Walsh
3
如果你的代码中有提交语句却没有回滚路径,我希望你不要让我来审核你的代码。try catch 块是有其存在的原因的。每当你使用明确的事务时,如果出现错误,你需要同时设定提交和回滚操作。请注意避免过度解释并保持原意不变。 - HLGEM
另外一个显式回滚的美妙之处在于,如果你使用一个表变量来存储异常原因和错误数据,你可以将导致问题的数据和异常原因放入一个表中,从而使查找错误变得更加容易。 - HLGEM
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接