SQL Server表被锁?快速查看与解锁方法

作者:技术拾光

时间:2026-07-29

浏览:177

在SQLServer中,表因会话事务未提交而被锁,导致查询卡住。可通过sys.dm_tran_locks获取锁表会话ID,用KILL命令杀掉进程解锁。使用WITH(NOLOCK)可避免阻塞,但可能读到脏数据。

文章目录

在日常使用SQL Server时,表被锁住的情况并不少见。最常见的原因就是某个会话窗口里的事务一直没提交,窗口也没关闭,这时候表锁就牢牢地攥在那个会话手里。其他任何连接去查这张表的数据,都会一直卡住,迟迟不返回结果。遇到这种情况,只能手动终止那个产生死锁的会话ID,才能恢复正常。

一、查看表锁

要找出是哪个会话锁了表,可以用下面这条查询语句:

select   request_session_id   spid,OBJECT_NAME(resource_associated_entity_id) tableName from sys.dm_tran_locks where resource_type='OBJECT'

假设执行时系统中有两个会话分别在不同的表上持有对象锁,返回的结果可能如下所示:

SQL Server表被锁?快速查看与解锁方法

在这个示例中:

  • 会话 ID 为 54 的会话在 Employees 表上持有对象锁。
  • 会话 ID 为 78 的会话在 Orders 表上持有对象锁。

二、解锁

找到锁表的会话ID后,执行下面的脚本就能终止它:

declare @spid  int Set @spid  = 57 --锁表进程declare @sql varchar(1000)set @sql='kill '+cast(@spid  as varchar)exec(@sql)

需要说明的是,SQL Server在执行查询语句时也会锁表,锁表期间禁止增删改操作。如果业务场景允许,不想因为查询造成阻塞,可以在表名或别名后面加上WITH(NOLOCK)——不过这可能会读到未提交的脏数据,使用前需要仔细权衡。示例如下:

SELECT Id FROM dbo.T_Table WITH(NOLOCK) WHERE Id = 1

总结

以上是处理SQL Server表锁的常见方法:先通过系统视图查出锁表的会话ID,再用KILL命令终止对应进程。日常开发中,合理使用NOLOCK提示或及时提交事务,也能有效避免表锁带来的困扰。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章