SQL Server更改数据库带有立即回滚。

10
有时,当(例如)执行以下命令将数据库设置为离线时,会抛出异常,因为一个或多个客户端已连接:

有时当(例如)执行以下命令将数据库设置为离线时,会抛出异常,因为一个或多个客户端已连接:

ALTER DATABASE <dbname> SET OFFLINE

根据这个答案,一种解决方案是在结尾处使用with rollback immediate

ALTER DATABASE <dbname> SET OFFLINE WITH ROLLBACK IMMEDIATE

但为什么这样会导致其他客户端断开连接呢?虽然它是有效的,但似乎这是一种非常不明显的强制断开连接的方式。

2个回答

13

当其他用户正在对数据库进行交易时,您无法将其脱机,因此您需要以某种方式断开用户的连接才能使数据库脱机。

如果您想礼貌一些,可以要求所有用户在您将数据库脱机之前完成他们正在做的事情

但如果这不切实际,包括以下选项

WITH ROLLBACK IMMEDIATE

意味着所有当前交易都被回滚(数据库被重置为交易开始的状态)。你也可以使用

WITH ROLLBACK AFTER 60 SECONDS

但是我从来没有不得不这样做过

如果您在未完成事务运行时将数据库离线,则数据库将处于不稳定状态,更改既不会进行也不会被取消


那么 WITH ROLLBACK IMMEDIATE 会回滚所有事务并隐式断开连接吗? - Jim Aho
1
此选项将回滚所有未提交的事务并重置所有连接,但不包括当前连接。 - Alexander Shapkin

0

来自MSDN

WITH <termination>::=

指定了在数据库从一个状态转换到另一个状态时,什么时候回滚未完成的事务。如果省略了终止子句,则 ALTER DATABASE 语句会无限期等待,如果数据库上有任何锁定。只能指定一个终止子句,并且它跟随 SET 子句。

在您的情况下,终止将是 ROLLBACK IMMEDIATE


我知道with rollback immediate确实会在出现错误时回滚所有更改,但是我想知道它为什么要断开与客户端的连接。这并没有回答我的问题。 - Jim Aho
因为一旦数据库离线,客户端就无法连接到它。这意味着在离线数据库之前必须先断开客户端的连接(这就是为什么会抛出异常)。这意味着在将数据库离线之前,您需要以某种方式断开连接。 - Tom Page

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