如何在SQL Server 2012中解锁表格?

18

我在 SQL Server 2012 中创建了一个表,在执行时

select * from tableName 

查询时间很长,有时候甚至没有结果。

目前只有一行数据。查询后发现被锁住了,请帮忙解锁或删除它?


3
哪个进程锁住了它?运行你的选择语句(select *),然后在等待时运行“exec sp_who2”。BlkBy列将显示另一个进程号阻止了您的选择语句。要清除该进程,您需要运行“KILL 32”(以进程32为例)。 - Rich Benner
嗨,Rich Benner, 我使用以下方法终止了会话,现在当我执行select *查询时,它会给我结果。这是正确的方法吗?将来不会有任何问题吗? - Pushkar Jaju
好的,谢谢Rich Benner。 - Pushkar Jaju
@RichBenner 我执行了“exec sp_who2”,并得到了一些包含我的dbName的行。请参考下面的示例。 580 - SPID 0 - EDID 睡眠 - 状态 UserName - LoginName FRCVD2161 - 主机名 IOSMOC_DB - dbName 等待命令 - cmd 0 - request_id 请建议。 - Pushkar Jaju
请尝试运行“DBCC INPUTBUFFER(61)”,将61替换为您的SPID。 - Rich Benner
显示剩余5条评论
2个回答

38
谢谢大家, 问题已经解决。
我执行了以下查询。
SELECT
    OBJECT_NAME(P.object_id) AS TableName,
    Resource_type,
    request_session_id
FROM
    sys.dm_tran_locks L
JOIN
    sys.partitions P ON L.resource_associated_entity_id = p.hobt_id
WHERE   
    OBJECT_NAME(P.object_id) = 'P1Chronolog_IncidentActivityUpdates'

并杀死了该对应的会话

Kill session_ID

1
对于现在找到这篇文章的每个人,我想提醒一下:虽然你可以像这样强制解锁,但你真的需要找出是什么在锁定它以及为什么要锁定它。锁的目的是防止出现恶性错误(请查找“竞态条件”),因此仅仅是杀死锁而不知道它们的作用是一个坏主意。 - MGOwen

5

获取锁定表的进程(SPId)并将其杀死,可参考以下步骤

    SELECT      r.start_time [Start Time],session_ID [SPID],
            DB_NAME(database_id) [Database],
            SUBSTRING(t.text,(r.statement_start_offset/2)+1,
            CASE WHEN statement_end_offset=-1 OR statement_end_offset=0 
            THEN (DATALENGTH(t.Text)-r.statement_start_offset/2)+1 
            ELSE (r.statement_end_offset-r.statement_start_offset)/2+1
            END) [Executing SQL], 
            Status,command,wait_type,wait_time,wait_resource, 
            last_wait_type
FROM        sys.dm_exec_requests r
OUTER APPLY sys.dm_exec_sql_text(sql_handle) t
WHERE       session_id != @@SPID -- don't show this query
AND         session_id > 50 -- don't show system queries
ORDER BY    r.start_time


DBCC opentran()

exec sp_who2 68
exec sp_lock 68
kill 68

对我来说,以下命令有效:DBCC opentran() exec sp_who2 68 exec sp_lock 68 kill 68 - Syed Nasir Abbas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接