0

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

ALTER DATABASE [{0}] SET SINGLE_USER WITH ROLLBACK IMMEDIATE; Drop Database [{0}]

最近,我们开始面临一个问题,即数据库进入单用户模式但未删除数据库并且应用程序停止工作,因为在此模式下一次只能激活一个连接。这个问题很少发生,而且根本不一致。我们对这里发生的事情一无所知。如果有人遇到过这样的问题或可能的原因,请告诉我。

我们正在使用 Sql Server 2008 R2

问候,

瓦伦

4

3 回答 3

0

您可能正处于竞争状态。在数据库设置为单用户和发出 DROP DATABASE 命令之间,如果任何其他连接成功,那么您将无法删除数据库。在大容量情况下,这可能很难解决。

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

于 2013-11-11T15:16:16.417 回答
0

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

在我们的案例中,我们通过在执行单用户和删除命令之前禁用试图访问数据库的服务帐户来处理这种竞争条件,从而为我们消除了这个问题。

如果您的系统具有类似的公共服务帐户,您可能能够实现类似的东西。

于 2013-11-11T15:39:34.483 回答
0

数据库设置为单用户模式文档说:

先决条件

在将数据库设置为 SINGLE_USER 之前,请确认 AUTO_UPDATE_STATISTICS_ASYNC 选项设置为 OFF。当此选项设置为 ON 时,用于更新统计信息的后台线程与数据库建立连接,您将无法在单用户模式下访问数据库

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

于 2018-11-08T09:37:07.160 回答