如何解决SQL Server错误1222,即解锁SQL Server表


75

我在一个数据库中工作,在该数据库中,我通过数据加载器将数据加载到原始表中。但是今天,数据加载器由于未知原因而卡住了。然后,我从Windows任务管理器中停止了数据加载器。但是随后我再次尝试将数据加载到原始表中,但发现其已锁定,并且无法对其进行任何操作。我尝试重新启动SQL Server服务,但未解决。而且我无权杀死该服务器上的进程。

下面是SQL Server显示的消息。

执行Transact-SQL语句或批处理时发生异常。(Microsoft.SqlServer.ConnectionInfo)

计划地点:

在Microsoft.SqlServer.Management.Common.ServerConnection.ExecuteNonQuery(字符串的SqlCommand,ExecutionTypes executionType)
在Microsoft.SqlServer.Management.Common.ServerConnection.ExecuteNonQuery(StringCollection sqlCommands,ExecutionTypes executionType)
在Microsoft.SqlServer.Management.Smo.ExecutionManager.ExecuteNonQuery (StringCollection查询)
在Microsoft.SqlServer.Management.Smo.SqlSmoObject.ExecuteNonQuery(StringCollection查询,布尔includeDbContext)
在Microsoft.SqlServer.Management.Smo.NamedSmoObject.RenameImplWorker(String newName)
在Microsoft.SqlServer.Management.Smo.NamedSmoObject。 RenameImpl(String newName)

==================================

超过了锁定请求超时期限。参数@objname不明确或声明的@objtype(OBJECT)错误。(.Net SqlClient数据提供程序)


服务器名称:162.44.25.59错误号:1222
严重性:16状态:56
过程:sp_rename行号:282

我的SQL Server版本是2008 R2。


您是否尝试杀死已锁定表的会话ID?您可以在服务器上的SQL Server活动监视器中检查它,也可以使用sp_lock2和sp_who的组合来查找需要杀死的会话。
askids 2011年

我没有足够的特权执行此操作,请问还有其他解决方案吗?
user960340 2011年

1
除了“等待”或“杀死”外,没有其他解决方案。该错误告诉您的是,另一个进程正在锁定您要使用的资源,这与您要执行的操作不兼容。您可以尝试再次运行以查看阻塞出现的位置(特别是哪个进程正在阻塞您的阻塞),但最终,它需要停止执行正在执行的操作才能继续。
Ben Thul 2011年

Answers:


183

在SQL Server Management Studio中,要查找活动事务的详细信息,请执行以下命令

DBCC opentran()

您将获得活动事务的详细信息,然后使用以下命令从活动事务的SPID中获取有关SPID的详细信息

exec sp_who2 <SPID>
exec sp_lock <SPID>

例如,如果SPID为69,则执行命令

exec sp_who2 69
exec sp_lock 69

现在,您可以使用以下命令终止该进程

KILL 69

我希望这有帮助 :)


你救了我----
GeorgeMR

3
kill命令将导致回滚,这可能需要一段时间。您可以使用命令kill 69 with statusonly查看更新的进度状态。您还可以使用commanddbcc inputbuffer(69)找出正在执行的SQL命令并导致锁定。
托尼

KILL {进程号} ==>解决了我的问题。谢谢,
Tarek El-Mallah'7

22

已经有一段时间了,但是上一次我有类似的事情:

ROLLBACK TRAN

或试图

COMMIT

已经做好的一切都释放了一切,所以我能够清除所有内容并重新开始。


3
我发现如果该查询窗口仍处于打开状态而导致表阻塞,则ROLLBACK TRAN / COMMIT可以正常工作,否则它将不起作用
user960340 2012年

1
幸运的是,我仍然有窗口打开,如果你不知道会发生什么不
鸡舍

4

为防止这种情况,请确保每个BEGIN TRANSACTION都已提交

以下内容表示成功,但将保留未提交的事务:

BEGIN TRANSACTION
BEGIN TRANSACTION
<SQL_CODE?
COMMIT

关闭具有未提交事务的查询窗口将提示您提交事务。通常,这将解决错误1222消息。


0

我在选项查询执行中启用了以下SQL行为设置:已检查ANSI SET IMPLICIT_TRANSACTIONS。在执行查询(例如创建,更改表或存储过程)时,必须提交查询。

只需键入COMMIT并执行 F5

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.