我有一个SQL Server服务和多个Windows服务在同一台服务器上做一些后台工作。
其中一个(我称之为"A"(有一个例程,在午夜对活动数据库执行"single_user/online"one_answers"online/multi_user"以执行一些备份操作。另一个在数据库上执行多个查询(我称之为"B"(。
问题如下:
1.-Windows服务"A"执行SET ONLINE
。
2.-Windows服务"B"执行随机SELECT
。
3.-Windows服务"A"尝试执行SET MULTI_USER
。由于存在从Windows服务"B"建立的活动连接,因此此执行被删除。
我曾尝试在SqlCommand的同一CommandText上执行SET ONLINE
和SET MULTI_USER
,但这并没有拒绝来自Windows服务"B"的传入查询,从而中断了我的进程并锁定了数据库(因为SINGLE_USER
(。
如何在Windows服务"A"上同时发出ONLINE
和MULTI_USER
命令,以取消Windows服务"B"或等待进程完成?(取消Windows服务"B"不是问题(
sp_dettach_db
或sp_attach_db
有用吗?
听起来服务A在将数据库带入单用户模式后正在关闭其连接。这就释放了服务B成为单个用户,在这一点上,服务A不能再改变模式,直到它能够夺回单个连接,而只要服务B或任何其他客户端拥有它,它就无法做到这一点
我能想到你可以在这里做的几件事:
- 离线操作完成后,开始轮询,直到服务A可以再次成为单个用户
- 从服务B中查找连接的SPID并终止它
有关更多信息,请参阅此链接中有关单用户模式的限制和限制部分。
感谢所有人,但我从一开始就重新分析了我遇到的问题,并得出结论,"SET SINGLE_USER"操作是不必要的,因为该过程不需要在该模式下执行操作,所以最后使用"SET OFFLINE"one_answers"SET ONLINE"操作可以防止中间连接问题。