在SQLServer中,表因会话事务未提交而被锁,导致查询卡住。可通过sys.dm_tran_locks获取锁表会话ID,用KILL命令杀掉进程解锁。使用WITH(NOLOCK)可避免阻塞,但可能读到脏数据。
SQL Server表被锁?快速查看与解锁方法
作者:技术拾光
时间:2026-07-29
浏览:177
文章目录
在日常使用SQL Server时,表被锁住的情况并不少见。最常见的原因就是某个会话窗口里的事务一直没提交,窗口也没关闭,这时候表锁就牢牢地攥在那个会话手里。其他任何连接去查这张表的数据,都会一直卡住,迟迟不返回结果。遇到这种情况,只能手动终止那个产生死锁的会话ID,才能恢复正常。
一、查看表锁
要找出是哪个会话锁了表,可以用下面这条查询语句:
select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) tableName from sys.dm_tran_locks where resource_type='OBJECT'
假设执行时系统中有两个会话分别在不同的表上持有对象锁,返回的结果可能如下所示:

在这个示例中:
- 会话 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提示或及时提交事务,也能有效避免表锁带来的困扰。
实用工具推荐
电子包浆
使用 ›绿化、压缩、噪点和虚拟水印,自由调节做旧程度。
图片压缩
使用 ›选择画质和输出格式,预览压缩前后的大小。
相关文章