我有一个独立的 Azure SQL 测试数据库,除了通过 SSMS 的开发计算机和开发 Web 应用程序实例之外,它没有活动连接。我是唯一一个使用此数据库的人。
我正在对 ~1M 记录的表运行一些测试,我们需要对几乎所有 ~1M 记录中的数据进行大量UPDATE
。
DECLARE @BatchSize INT = 1000
WHILE @BatchSize > 0
BEGIN
UPDATE TOP (@BatchSize)
[MyTable]
SET
[Data] = [Data] + ' a change'
WHERE
[Data] IS NOT NULL
SET @BatchSize = @@ROWCOUNT
RAISERROR('Updated %d records', 0, 1, @BatchSize) WITH NOWAIT
END
此查询工作正常,我可以看到我的数据每隔几秒钟一次更新 1000 条记录。
对MyTable
执行额外的INSERT
/UPDATE
/DELETE
命令似乎受到此批处理查询运行的影响,但这些操作在运行时会在几秒钟内执行。我认为这是因为MyTable
正在采用锁,而我的其他命令将在批处理查询的锁/循环迭代之间执行。
此行为都是意料之中的。
但是,在批处理查询运行时,我注意到MyTable
上的其他INSERT
/UPDATE
/DELETE
命令将不再执行。它们总是超时/永远不会完成。我假设MyTable
发生了某种类型的锁定,但似乎该锁从未被释放。此外,即使我取消长时间运行的更新批处理查询,我仍然无法再对MyTable
运行任何INSERT
/UPDATE
/DELETE
命令。即使在数据库陈旧 10-15 分钟之后,我也无法在MyTable
上执行写入命令。我发现将数据库从发生的任何事件中"释放"出来的唯一方法是将其向上和向下扩展到新的定价层。我假设此定价层更改是回收/重启实例或其他内容。
在今天的测试中,我已经多次重现了这种行为。
这是怎么回事?
向上/向下扩展层回滚所有打开的事务并断开服务器登录。
关于您所看到的,它似乎是锁定升级。尝试使用 sp_getapplock 序列化对数据库的访问。您也可以尝试锁定提示。