如何检查表上保存的锁

时间:2009-03-29 12:46:43

标签: sql sql-server database performance sql-server-2005

我们如何检查针对查询批处理对哪些行应用了哪些数据库锁?

任何实时突出显示表行级锁定的工具?

DB:SQL Server 2005

7 个答案:

答案 0 :(得分:109)

要添加到其他响应,sp_lock还可用于转储所有正在运行的进程的完整锁定信息。输出可能是压倒性的,但如果你想知道锁定的确切内容,那么它就是一个很有价值的输出。我通常与sp_who2一起使用它来快速解决锁定问题。

根据所讨论的SQL Server版本,网上有多个不同版本的“友好”sp_lock程序。

在您的情况下,对于SQL Server 2005,sp_lock仍然可用,但已弃用,因此现在建议使用sys.dm_tran_locks视图进行此类操作。您可以找到如何“自己动手”sp_lock函数here的示例。

答案 1 :(得分:101)

这并不能完全显示哪些行被锁定,但这可能对您有所帮助。

您可以通过运行此命令来检查哪些语句被阻止:

select cmd,* from sys.sysprocesses
where blocked > 0

它还会告诉您每个块正在等待的内容。因此,您可以一直跟踪,以查看哪个语句导致导致其他块的第一个块。

修改以添加@MikeBlandford的评论:

  

阻止列表示阻止进程的spid。您可以运行kill {spid}来修复它。

答案 2 :(得分:38)

您可以通过以下查询在桌面上找到当前的

USE yourdatabase;
GO

SELECT * FROM sys.dm_tran_locks
  WHERE resource_database_id = DB_ID()
  AND resource_associated_entity_id = OBJECT_ID(N'dbo.yourtablename');

请参阅sys.dm_tran_locks

如果存在相同 request_owner_type 的多个实例,则 request_owner_id 列用于区分每个实例。对于分布式事务, request_owner_type request_owner_guid 列将显示不同的实体信息。

例如,会话S1在Table1上拥有共享锁;在会话S1下运行的事务T1也拥有Table1上的共享锁。在这种情况下, sys.dm_tran_locks 返回的 resource_description 列将显示同一资源的两个实例。 request_owner_type 列会将一个实例显示为会话,将另一个实例显示为事务。此外, resource_owner_id 列将具有不同的值。

答案 3 :(得分:35)

我使用动态管理视图(DMV)来捕获锁定以及锁定项目的object_id或partition_id。

(必须切换到你想要观察的数据库以获得object_id)

SELECT 
     TL.resource_type,
     TL.resource_database_id,
     TL.resource_associated_entity_id,
     TL.request_mode,
     TL.request_session_id,
     WT.blocking_session_id,
     O.name AS [object name],
     O.type_desc AS [object descr],
     P.partition_id AS [partition id],
     P.rows AS [partition/page rows],
     AU.type_desc AS [index descr],
     AU.container_id AS [index/page container_id]
FROM sys.dm_tran_locks AS TL
INNER JOIN sys.dm_os_waiting_tasks AS WT 
 ON TL.lock_owner_address = WT.resource_address
LEFT OUTER JOIN sys.objects AS O 
 ON O.object_id = TL.resource_associated_entity_id
LEFT OUTER JOIN sys.partitions AS P 
 ON P.hobt_id = TL.resource_associated_entity_id
LEFT OUTER JOIN sys.allocation_units AS AU 
 ON AU.allocation_unit_id = TL.resource_associated_entity_id;

答案 4 :(得分:17)

您还可以使用内置的sp_who2存储过程来获取SQL Server实例上的当前阻止和阻止进程。通常,您将与SQL事件探查器实例一起运行此命令以查找阻塞进程,并查看在探查器中发出的spid的最新命令。

答案 5 :(得分:2)

您可以通过以下脚本找到详细信息。

page[size="A4"] {
  background: white;
  width: 21cm;
  height: 29.7cm;
  display: block;
  margin: 0 auto;
  margin-bottom: 0.5cm;

}
@media print {
  page[size="A4"] {
    margin: 0;
    box-shadow: 0;
        width: 21cm;
  height: 29.7cm;
  }
}

答案 6 :(得分:0)

您可以通过运行以下命令找到阻塞的sql并等待sql:

MQCONN(Qmgr-name)
MQOPEN(Reply-Q)
Build PCF message for MQCMD_CHANGE_CHANNEL
          with MQCACH_CHANNEL_NAME
          with MQIACH_CHANNEL_TYPE
          with MQCACH_MCA_USER_ID
MQPUT1(PCF Message to SYSTEM.ADMIN.COMMAND.QUEUE)
MQGET(wait for reply on Reply-Q to say whether it worked or not)