Fem*_*emi 5 t-sql sql-server-2012
我正在尝试运行下面的 SQL 语句:
ALTER DATABASE DBNAME
SET READ_COMMITTED_SNAPSHOT ON
Run Code Online (Sandbox Code Playgroud)
然而,当我运行时,它没有完成执行,我必须在 1 小时后终止。
对于如何在不断开所有其他用户与数据库的连接的情况下运行它,有什么建议吗?谢谢
完成此命令需要立即成为针对数据库打开的唯一事务。在我看来,这几乎需要您将数据库短暂置于单用户模式。但也许如果您只是让查询(尝试)过夜运行,那么在某些时候您就会获得神奇的瞬间。
这里有更多关于该主题的信息:http://www.brentozar.com/archive/2013/01/implementing-snapshot-or-read-commited-snapshot-isolation-in-sql-server-a-guide/
编辑:在线书籍提供了更多细节:
当您将 ALLOW_SNAPSHOT_ISOLATION 设置为新状态(从 ON 到 OFF,或从 OFF 到 ON)时,ALTER DATABASE 不会将控制权返回给调用者,直到提交数据库中的所有现有事务。如果数据库已处于 ALTER DATABASE 语句中指定的状态,则控制权将立即返回给调用者。如果 ALTER DATABASE 语句没有快速返回,请使用 sys.dm_tran_active_snapshot_database_transactions 确定是否存在长时间运行的事务。如果取消 ALTER DATABASE 语句,数据库将保持启动 ALTER DATABASE 时的状态。sys.databases 目录视图指示数据库中快照隔离事务的状态。如果 snapshot_isolation_state_desc = IN_TRANSITION_TO_ON,则 ALTER DATABASE ALLOW_SNAPSHOT_ISOLATION OFF 将暂停六秒并重试该操作。