SQL Server使用立即回滚来更改数据库

时间:2016-01-04 11:03:13

标签: sql-server rollback alter-table

有时(例如)通过执行以下命令将数据库设置为脱机时,将抛出异常,因为连接了一个或多个客户端:

ALTER DATABASE <dbname> SET OFFLINE

根据this answer,一个解决方案是在最后使用with rollback immediate

ALTER DATABASE <dbname> SET OFFLINE WITH ROLLBACK IMMEDIATE

为什么实际上这会断开其他客户端?这听起来像是一种非常明显的强制断开连接的方式,尽管它有效。

2 个答案:

答案 0 :(得分:7)

当其他用户在其上运行事务时,您无法使数据库脱机,因此您将不得不以这种或那种方式断开用户以使数据库脱机。

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

但如果这不合实,包括选项

WITH ROLLBACK IMMEDIATE

表示所有当前事务都被回滚(数据库重置为事务开始的点)。你也可以使用

WITH ROLLBACK AFTER 60 SECONDS

但我从未必须

如果您在未完成的事务正在运行时可以使数据库脱机,那么数据库将处于不稳定状态,既未进行更改也未取消

答案 1 :(得分:0)

来自MSDN

WITH&lt; termination&gt; :: =

  

指定何时在数据库时回滚未完成的事务   从一个州过渡到另一个州。如果是终止条款   如果省略,ALTER DATABASE语句将无限期地等待   是对数据库的任何锁定。只有一个终止条款可以   指定,它遵循SET子句。

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