在SQL Server上回滚事务并解锁表

4

嗨,有时候我会遇到因为未知事务未关闭或表被锁定而导致SQL Server出现问题。我读了很多建议,以避免重新启动服务器,直到我发现了这个方法,它似乎起作用了。
你有其他的建议来释放锁并回滚事务吗?因为我对在生产服务器上运行此操作持保留态度。

USE master;
GO
ALTER DATABASE [db_dev]
SET SINGLE_USER
WITH ROLLBACK IMMEDIATE;
ALTER DATABASE [db_dev]
SET MULTI_USER;
GO

1
你确定已经找到了是什么在占用锁吗?你可以使用 KILL 命令关闭单个连接,而无需重启服务器或使数据库离线。 - Pondlife
你可以使用KILL来解锁,(开发人员)查询@@TRANCOUNT的值以获取打开的事务。对于某些存储过程和语句,你也可以使用SET XACT_ABORT ON。 - ejlepoud
2个回答

10

您可以使用以下方法检查阻止进程的原因:

sp_who2

然后

kill spid

将其设置为single_user,然后还原回去会删除该数据库的所有连接。 在生产服务器上可能非常危险。


2
如果你锁定了一张表,你可以使用以下代码来终止它:
    SELECT OBJECT_NAME(P.object_id) AS TableName,
           Resource_type,
           request_session_id
    FROM sys.dm_tran_locks AS L
         JOIN sys.partitions AS P ON L.resource_associated_entity_id = p.hobt_id
    WHERE OBJECT_NAME(P.object_id) = '<Table_Name>';

    GO
    Kill session_ID

当sys.dm_tran_locks也被锁定时,这将不起作用。 - Paul Carlton

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