Sql server Sql server数据库在删除时处于单用户模式

Sql server Sql server数据库在删除时处于单用户模式,sql-server,database,sql-server-2008,Sql Server,Database,Sql Server 2008,我们的应用程序使用多个数据库,用户可以通过UI创建这些数据库。基本上,这些数据库是在从数据文件加载数据后创建的(ETL过程) 我们在不需要这些数据库时删除它们。 我们使用以下声明将其删除: alterdatabase[{0}]设置单用户立即回滚;删除数据库[{0}] 最近,我们开始面临这样一个问题:数据库进入单用户模式,但数据库没有被删除,应用程序停止工作,因为在这种模式下一次只能有一个连接处于活动状态。这个问题很少发生,而且根本不一致。 我们不知道这里发生了什么。 如果有人遇到过这样的问题或可

我们的应用程序使用多个数据库,用户可以通过UI创建这些数据库。基本上,这些数据库是在从数据文件加载数据后创建的(ETL过程) 我们在不需要这些数据库时删除它们。 我们使用以下声明将其删除:

alterdatabase[{0}]设置单用户立即回滚;删除数据库[{0}]

最近,我们开始面临这样一个问题:数据库进入单用户模式,但数据库没有被删除,应用程序停止工作,因为在这种模式下一次只能有一个连接处于活动状态。这个问题很少发生,而且根本不一致。 我们不知道这里发生了什么。 如果有人遇到过这样的问题或可能的原因,请告诉我

我们正在使用SQLServer2008R2

问候,


瓦伦

你可能正处于比赛状态。从数据库设置为单用户到发出DROP database命令(如果任何其他连接成功)之间,您将无法删除数据库。在高容量情况下,这可能很难解决


最好的办法是将数据库设置为脱机,而不是将其放入单个用户。当然,在这种情况下,您必须手动删除数据库文件

我在一个特别大的环境中工作,在这个环境中,在任何给定的时间都有50多台机器在敲打数据库进行连接。即使连接之间设置了延迟,尝试的次数也非常多

在我们的例子中,我们通过禁用服务帐户来处理这种竞争情况,该帐户在执行单用户和drop命令之前试图访问数据库,从而消除了我们的问题

如果您的系统具有类似的公共服务帐户,则您可以实现类似的功能。

文档中说:

先决条件

在将数据库设置为单用户之前,请验证 自动更新统计异步选项设置为关闭。当选择此选项时 设置为ON,用于更新统计信息的后台线程 与数据库建立连接,您将无法 以单用户模式访问数据库


否则,将数据库设置为SINGLE_USER的连接应立即成为该数据库的当前和单个用户,直到您关闭该连接(请注意,如果您的系统正在使用保持连接打开的连接池,则该连接可以保持“正在使用”,但这与您的问题无关).

您是否收到有关
删除数据库
命令的任何错误?嗨,Jon,这种类型的竞争条件的可能性是不可能的,因为一旦数据库进入单用户模式,它就无法接受或打开任何其他连接。此外,Alter database命令在自动提交模式下运行,因此在运行该命令后,无法与该数据库建立其他连接。单用户表示只能建立一个连接。如果已连接到数据库,则无法删除该数据库,因此根据定义,在其上运行删除的连接不能是单一连接。因此,在ALTER完成和删除开始之间连接到数据库的任何其他人都会阻止您的删除操作。我自己在经常活动的数据库上遇到过这个问题。您可以做的是在连接到数据库时运行ALTER来获取单个连接,然后在删除之前添加USE MASTER GO。