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

Sql server 为什么我的Azure SQL数据库表被永久锁定?,sql-server,azure,azure-sql-database,Sql Server,Azure,Azure Sql Database,我有一个孤立的Azure SQL测试数据库,除了通过SSM的开发机器和开发web应用程序实例之外,它没有任何活动连接。我是唯一一个使用这个数据库的人 我正在一个约1M条记录的表上运行一些测试,我们需要对几乎所有约1M条记录中的数据进行大规模的更新 DECLARE @BatchSize INT = 1000 WHILE @BatchSize > 0 BEGIN UPDATE TOP (@BatchSize) [MyTable] SET [Da

我有一个孤立的Azure SQL测试数据库,除了通过SSM的开发机器和开发web应用程序实例之外,它没有任何活动连接。我是唯一一个使用这个数据库的人

我正在一个约1M条记录的表上运行一些测试,我们需要对几乎所有约1M条记录中的数据进行大规模的
更新

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
上执行write命令。我发现,从发生的任何事情中“释放”数据库的唯一方法是将其上下扩展到新的定价层。我假设此定价层更改是回收/重新启动实例或其他内容

在今天的测试中,我多次重复这种行为


这是怎么回事?

放大/缩小层回滚所有打开的事务并断开服务器登录


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

为什么在循环中引发错误?print语句不是更简单一点吗?@SeanLange
RAISERROR
在消息发生时打印消息,而不是
print
缓冲消息。看有趣的。我从来都不需要像这样查看消息。很高兴知道,所以我撒谎了。我的批处理更新脚本的上一次迭代涉及到一个事务。我认为这里发生的事情是,当我在测试期间取消SSMS中的查询时,我会留下打开的事务,这些事务最终会锁定表。我会做更多的测试来确认。谢谢你的信息!我刚刚再次完成了场景测试,就这样。我提交了所有未结交易,表被解锁。太棒了!干得好。