【SQL Server】笔记-查看表是否被锁并解锁表
前言
最近遇到一个问题:笔者想要清空某个表,发现无论是DELETE
还是TRUNCATE
命令都无响应。而SELECT
命令则能正常快速响应,且表中也就区区几千行数据。不用说,肯定是发生了锁表。这里作为笔记来记录一下解锁过程
1、确认锁表
SELECT request_session_id [pid], t.name AS [tableName], l.*
FROM sys.dm_tran_locks l
LEFT JOIN sys.tables t ON t.object_id = l.resource_associated_entity_id
WHERE l.resource_type='OBJECT'
AND t.name = 'MyTable'
-- AND l.resource_associated_entity_id = OBJECT_ID('dbo.MyTable')
脚本中最后两行都用于筛选指定表,只用其一即可
2、解锁
DECLARE @pid INT = 119; --锁表进程ID
DECLARE @sql VARCHAR(200)
SET @sql='KILL '+CAST(@spid AS VARCHAR(100))
EXEC(@sql);
友情提示:通过解锁杀进程是最简单粗暴的方式,笔者是在开发环境中使用这种方式。在生产环境中还是要先确认杀进程的影响,确保风险可控。