为什么我的Azure SQL数据库表会永久锁定?

时间:2018-03-01 19:49:13

标签: sql-server azure azure-sql-database

我有一个独立的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条记录。

INSERT上执行其他UPDATE / DELETE / MyTable命令似乎受到此批处理查询运行的影响,但这些操作确实在几秒钟内执行跑了。我假设这是因为在MyTable上进行了锁定,而我的其他命令将在批量查询的锁定/循环迭代之间执行。

这种行为都是预期的。

但是,在批量查询运行时,我经常会注意到INSERT上的其他UPDATE / DELETE / MyTable命令将不再执行。他们总是超时/永不完成。我假设在MyTable上发生了某种类型的锁定,但似乎永远不会释放锁定。此外,即使我取消了长时间运行的更新批处理查询,我仍然无法再在INSERT上运行任何UPDATE / DELETE / MyTable命令。即使数据库处于失效状态10-15分钟后,我也无法在MyTable上执行写命令。我找到的唯一方法是"释放"无论发生什么,数据库都要将其向上和向下扩展到新的定价层。我假设这个定价层更改是回收/重新启动实例或其他东西。

我在今天的测试中多次重现了这种行为。

这里发生了什么?

1 个答案:

答案 0 :(得分:2)

向上/向下扩展层会回滚所有打开的事务并断开服务器登录。

关于你所看到的似乎是锁定升级。尝试使用sp_getapplock序列化对数据库的访问。您也可以尝试lock hints