我可以修改SQL Server,以便没有隐含的回滚

时间:2015-08-07 07:07:02

标签: sql-server transactions rollback

上下文:
我有一个正在从Jet迁移到SQL Server后端的应用程序。该应用程序的一部分包括用户可自定义的“搜索”。搜索在当前连接上启动事务,执行一系列语句提供一些结果,然后提交更改。如果出现错误,则发送“ROLLBACK TRAN”并提供错误消息。

不幸的是,我已经与隐含的回滚相冲突了。某些错误(例如,使用未命名的列创建视图)将创建隐含的回滚,将所有内容回滚到第一个“BEGIN TRAN”。这导致两个问题。第一个问题是次要的:当我执行“ROLLBACK TRAN”(或回滚到保存点)以响应错误(我将需要非隐含回滚错误)时,我收到一条错误消息,告诉我我可以'回滚,因为没有交易。没什么大不了的,我可以识别并忽略这些。

我遇到的主要问题是如果我正在编辑和测试搜索 - 这个错误意味着搜索的任何未提交的更改也将被回滚,并且表单将处于不一致的模式(基本上它会认为它处于编辑模式,但实际上它处于查看模式)。所有这一切目前都是在一个连接下完成的,重写它将是一件痛苦的事。

我已经对此事做了一些研究,我想我可能不得不将当前搜索移动到另一个指定的表并在单独的连接上执行,但我想知道是否有更有效的解决方案。
< BR />问:
我可以修改SQL Server的行为,因此没有错误会导致隐含的回滚吗?

如果我正在编辑搜索,我应该将搜索移动到指定的表格,然后从单独的连接执行(这样我可以在不影响先前版本的情况下访问当前搜索)?

还有其他更优化的方法吗?

PS:对于文本墙的道歉,如果我违反网络礼节,我的大部分简单问题都已经得到了回答,我以前从来没有问过问题。向无所不知的谷歌致敬。

1 个答案:

答案 0 :(得分:0)

事实证明我所寻找的东西是不可能的。 SQL用于在发生某些错误时自动回滚到第一个BEGIN TRANSACTION。有一个选项 - 推荐选项 - 可以更改SQL的默认行为,因此所有错误都会自动回滚,而不仅仅是一些错误。

设置xact_abort on。