【问题标题】:How to solve SQL Server Error 1222 i.e Unlock a SQL Server table如何解决 SQL Server 错误 1222,即解锁 SQL Server 表
【发布时间】:2011-11-24 14:35:12
【问题描述】:

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

以下是 SQL Server 显示的消息。

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

节目地点:

在 Microsoft.SqlServer.Management.Common.ServerConnection.ExecuteNonQuery(String 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(字符串 新名称)
在 Microsoft.SqlServer.Management.Smo.NamedSmoObject.RenameImpl(字符串 新名称)

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

已超过锁定请求超时期限。参数@objname 是模棱两可的或声称的@objtype (OBJECT) 是错误的。 (。网 SqlClient 数据提供者)


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

我的 SQL Server 版本是 2008 R2。

【问题讨论】:

  • 您是否尝试杀死锁定表的会话ID?您可以在服务器上的 SQL Server 活动监视器中查看它或使用 sp_lock2 和 sp_who 的组合来查找需要终止的会话。
  • 我的权限不够,请问有没有其他解决办法??
  • 除了“等待”或“杀死”之外没有其他解决方案。该错误告诉您的是另一个进程正在锁定您尝试使用的资源,这与您尝试执行的操作不兼容。您可以尝试再次运行以查看阻塞出现的位置(具体来说,是哪个进程阻塞了您的进程),但最终,它需要停止执行它正在执行的操作才能继续。

标签: sql-server database sql-server-2008-r2 locking deadlock


【解决方案1】:

在 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

我希望这会有所帮助:)

【讨论】:

  • 你救了我----
  • kill 命令会导致回滚,这可能需要一段时间。您可以使用命令kill 69 with statusonly 来查看更新的进度状态。您还可以使用命令dbcc inputbuffer(69) 找出正在执行的 SQL 命令并导致锁定。
  • KILL {进程号} ==> 解决了我的问题。谢谢,
  • 谢谢,伙计。你的回答很有帮助?
  • 如此简单优雅。你今天教我一些东西。谢谢
【解决方案2】:

已经有一段时间了,但上次我有类似的东西:

ROLLBACK TRAN

或尝试

COMMIT

所有已经完成的事情都被释放了,所以我能够把事情清理干净并重新开始。

【讨论】:

  • 我发现 ROLLBACK TRAN/COMMIT 工作如果该查询窗口仍然打开导致表块,否则它不起作用
  • 幸好我的窗口还开着,不知道不开会怎样
【解决方案3】:

为防止这种情况,请确保每个 BEGIN TRANSACTION 都有 COMMIT

下面会说成功但会留下未提交的事务:

BEGIN TRANSACTION
BEGIN TRANSACTION
<SQL_CODE?
COMMIT

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

【讨论】:

    【解决方案4】:

    我在选项查询执行时启用了这些 SQL 行为设置:ANSI SET IMPLICIT_TRANSACTIONS 检查。在执行查询时,例如创建、更改表或存储过程,您必须提交它。

    只需输入 COMMIT 并执行 F5

    【讨论】:

      【解决方案5】:

      在我的例子中,当我收到错误 1222“超过锁定请求超时期限”时,我试图禁用表上的触发器。

      我听从了this answer的建议:

      1. 在 SSMS 中打开两个查询窗口。
      2. 首先,键入/粘贴超时的命令(由于锁定)。在 SSMS 的右下角,您应该看到用户名和(在括号中)您正在使用的连接的 SPID。请注意此查询窗口连接的 SPID。暂时不要执行此查询。
      3. 在第二个查询窗口中,键入/粘贴您在步骤 2&gt; 中记下的 SELECT * FROM sysprocesses WHERE spid = &lt;SPID
      4. 执行第一个超时查询,并在它执行时(但在超时之前)切换到第二个查询窗口并执行它(SELECT * from sysprocesses... 之一)
      5. 您应该在结果窗格中获得一些结果。查看结果中的 'blocked' 字段。在我的例子中,它包含锁定表的进程的 SPID。
      6. 通过在步骤 5&gt; 的“阻塞”字段中执行 SELECT * FROM sysprocesses WHERE spid = &lt;SPID 来进一步研究锁定过程。
      7. 如果可以安全终止锁定进程,请使用kill &lt;locking SPID&gt; 将其终止

      【讨论】:

        猜你喜欢
        • 2019-07-11
        • 2023-03-12
        • 1970-01-01
        • 2019-07-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多