我们如何检查针对查询批处理对哪些行应用了哪些数据库锁?
任何实时突出显示表行级锁定的工具?
DB:SQL Server 2005
答案 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');
如果存在相同 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)