如何检查对查询批处理的哪些行应用了哪些数据库锁?
有什么工具可以实时突出显示表行级锁吗?
数据库:SQL Server 2005
如何检查对查询批处理的哪些行应用了哪些数据库锁?
有什么工具可以实时突出显示表行级锁吗?
数据库:SQL Server 2005
当前回答
这并没有确切地显示哪些行被锁定,但这可能对您有帮助。
你可以通过运行以下命令来检查哪些语句被阻塞:
select cmd,* from sys.sysprocesses
where blocked > 0
它还会告诉你每个块正在等待什么。所以你可以一直追踪到哪条语句引起了第一个块,又引起了其他块。
编辑添加来自@MikeBlandford的评论:
blocked列表示阻塞进程的spid。你可以运行kill {spid}来修复它。
其他回答
这并没有确切地显示哪些行被锁定,但这可能对您有帮助。
你可以通过运行以下命令来检查哪些语句被阻塞:
select cmd,* from sys.sysprocesses
where blocked > 0
它还会告诉你每个块正在等待什么。所以你可以一直追踪到哪条语句引起了第一个块,又引起了其他块。
编辑添加来自@MikeBlandford的评论:
blocked列表示阻塞进程的spid。你可以运行kill {spid}来修复它。
您还可以使用内置的sp_who2存储过程来获取SQL Server实例上当前阻塞和阻塞的进程。通常,您将与SQL Profiler实例一起运行该命令,以查找阻塞进程,并查看spid在Profiler中发出的最新命令。
我使用动态管理视图(Dynamic Management View, 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;
为了增加其他响应,sp_lock还可以用来转储所有运行进程的完整锁信息。输出可能非常庞大,但是如果您想确切地知道锁定了什么,那么运行它是很有价值的。我通常将它与sp_who2一起使用,以快速解决锁定问题。
根据SQL Server版本的不同,在线上有多个“更友好”的sp_lock过程。
在您的示例中,对于SQL Server 2005, sp_lock仍然可用,但已弃用,因此现在建议使用sys. lock。Dm_tran_locks视图。您可以在这里找到如何“滚动您自己的”sp_lock函数的示例。
您可以通过以下查询来查找表上的当前锁。
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. description返回的resource_description列。Dm_tran_locks将显示同一资源的两个实例。request_owner_type列将一个实例显示为会话,另一个实例显示为事务。此外,resource_owner_id列将具有不同的值。