首页 > 解决方案 > SQL Server BULK INSERT 出错并且没有释放 Sch-M 锁,表不可访问

问题描述

TLDR:我认为 SQL Server 没有释放 Sch-M 锁,我无法释放它或找到持有锁的事务

我试图构建另一个表的副本并在磁盘上的数据更新上运行一些基准测试,当在空表上运行 BULK INSERT 时出错,因为我使用了错误的文件名。我通过从 SQL Server Management Studio 的记事本中选择大部分文本并点击“执行”按钮来运行脚本。现在,任何关于表的查询都无法执行,包括手动刷新时 SQL Server Management Studio 中的 OBJECT_ID 或架构信息等内容。查询只是挂起,在后一种情况下,SSMS 会给出一个关于锁在超时内没有被放弃的错误。

到目前为止,我已经采取了一些调试步骤。

我查看了sys.dm_tran_locks根据数据库的资源 ID 过滤的表。在那里,我可以看到数据库本身上的许多共享锁和一些独占键锁,以及一个对象上的恰好 1 个锁,即 Sch-M 锁。当我尝试从表上的资源 ID 获取对象名称时sys.dm_tran_locks,查询就像 OBJECT_ID() 一样挂起(并且不适用于其他表名/ID)。锁引用会话 ID 54。

我还查看了该sys.dm_exec_requests表以尝试查找有关 SPID 54 的更多信息,但没有具有该会话 ID 的行。实际上,唯一的进程是我自己拥有的进程sa和检查表的单个查询sys.dm_exec_requests

由此看来,如果我正确理解了所有内容,那么 BULK INSERT 语句似乎不知何故未能释放它所需要的 Sch-M 锁。

所以这是我的问题:如果拥有它的进程似乎不再存在,为什么表上仍然存在 Sch-M 锁?是否有某种方法可以在不重新启动 SQL Server 进程的情况下恢复对表的访问?在 BULK INSERT 运行后脚本中的 SQL 代码是否会在空表上运行?

我正在使用 SQL Server 2016 和 SQL Server Management Studio 2016。

标签: sqlsql-serverssms

解决方案


推荐阅读