usm*_*een 147 sql database sql-server performance sql-server-2005
我们如何针对查询批处理检查针对哪些行应用了哪些数据库锁?
任何突出显示表行级锁定的工具?
DB:SQL Server 2005
mwi*_*ahl 115
要添加到其他响应,sp_lock
还可以用于在所有正在运行的进程上转储完整锁定信息.输出可能是压倒性的,但如果你想确切地知道什么是锁定的,那么它是一个很有价值的运行.我经常使用它sp_who2
来快速解决锁定问题.
sp_lock
根据所讨论的SQL Server 版本,有多种不同版本的"友好" 程序可在线获取.
在您的情况下,对于SQL Server 2005,sp_lock
仍然可用,但已弃用,因此现在建议将sys.dm_tran_locks
视图用于此类事情.您可以在此处找到如何"自己动手"sp_lock函数的示例.
Bri*_*ndy 107
这并不能完全显示哪些行被锁定,但这可能对您有所帮助.
您可以通过运行以下命令来检查哪些语句被阻止:
select cmd,* from sys.sysprocesses
where blocked > 0
Run Code Online (Sandbox Code Playgroud)
它还会告诉您每个块正在等待的内容.因此,您可以一直跟踪,以查看哪个语句导致导致其他块的第一个块.
编辑以添加来自@MikeBlandford的评论:
被阻止的列表示阻塞过程的spid.您可以运行kill {spid}来修复它.
Som*_*luk 48
您可以通过以下查询在表上找到当前锁.
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');
Run Code Online (Sandbox Code Playgroud)
如果存在相同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列将具有不同的值.
小智 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;
Run Code Online (Sandbox Code Playgroud)
Nei*_*ell 16
您还可以使用内置sp_who2
存储过程来获取SQL Server实例上的当前阻止和阻止进程.通常,您将与SQL事件探查器实例一起运行此命令以查找阻塞进程并查看在探查器中发出的spid的最新命令.
Met*_*lay 15
您可以通过以下脚本找到详细信息。
-- List all Locks of the Current Database
SELECT TL.resource_type AS ResType
,TL.resource_description AS ResDescr
,TL.request_mode AS ReqMode
,TL.request_type AS ReqType
,TL.request_status AS ReqStatus
,TL.request_owner_type AS ReqOwnerType
,TAT.[name] AS TransName
,TAT.transaction_begin_time AS TransBegin
,DATEDIFF(ss, TAT.transaction_begin_time, GETDATE()) AS TransDura
,ES.session_id AS S_Id
,ES.login_name AS LoginName
,COALESCE(OBJ.name, PAROBJ.name) AS ObjectName
,PARIDX.name AS IndexName
,ES.host_name AS HostName
,ES.program_name AS ProgramName
FROM sys.dm_tran_locks AS TL
INNER JOIN sys.dm_exec_sessions AS ES
ON TL.request_session_id = ES.session_id
LEFT JOIN sys.dm_tran_active_transactions AS TAT
ON TL.request_owner_id = TAT.transaction_id
AND TL.request_owner_type = 'TRANSACTION'
LEFT JOIN sys.objects AS OBJ
ON TL.resource_associated_entity_id = OBJ.object_id
AND TL.resource_type = 'OBJECT'
LEFT JOIN sys.partitions AS PAR
ON TL.resource_associated_entity_id = PAR.hobt_id
AND TL.resource_type IN ('PAGE', 'KEY', 'RID', 'HOBT')
LEFT JOIN sys.objects AS PAROBJ
ON PAR.object_id = PAROBJ.object_id
LEFT JOIN sys.indexes AS PARIDX
ON PAR.object_id = PARIDX.object_id
AND PAR.index_id = PARIDX.index_id
WHERE TL.resource_database_id = DB_ID()
AND ES.session_id <> @@Spid -- Exclude "my" session
-- optional filter
AND TL.request_mode <> 'S' -- Exclude simple shared locks
ORDER BY TL.resource_type
,TL.request_mode
,TL.request_type
,TL.request_status
,ObjectName
,ES.login_name;
--TSQL commands
SELECT
db_name(rsc_dbid) AS 'DATABASE_NAME',
case rsc_type when 1 then 'null'
when 2 then 'DATABASE'
WHEN 3 THEN 'FILE'
WHEN 4 THEN 'INDEX'
WHEN 5 THEN 'TABLE'
WHEN 6 THEN 'PAGE'
WHEN 7 THEN 'KEY'
WHEN 8 THEN 'EXTEND'
WHEN 9 THEN 'RID ( ROW ID)'
WHEN 10 THEN 'APPLICATION' end AS 'REQUEST_TYPE',
CASE req_ownertype WHEN 1 THEN 'TRANSACTION'
WHEN 2 THEN 'CURSOR'
WHEN 3 THEN 'SESSION'
WHEN 4 THEN 'ExSESSION' END AS 'REQUEST_OWNERTYPE',
OBJECT_NAME(rsc_objid ,rsc_dbid) AS 'OBJECT_NAME',
PROCESS.HOSTNAME ,
PROCESS.program_name ,
PROCESS.nt_domain ,
PROCESS.nt_username ,
PROCESS.program_name ,
SQLTEXT.text
FROM sys.syslockinfo LOCK JOIN
sys.sysprocesses PROCESS
ON LOCK.req_spid = PROCESS.spid
CROSS APPLY sys.dm_exec_sql_text(PROCESS.SQL_HANDLE) SQLTEXT
where 1=1
and db_name(rsc_dbid) = db_name()
--Lock on a specific object
SELECT *
FROM sys.dm_tran_locks
WHERE resource_database_id = DB_ID()
AND resource_associated_entity_id = object_id('Specific Table');
Run Code Online (Sandbox Code Playgroud)
您可以通过运行以下命令找到阻塞的 sql 并等待 sql:
SELECT
t1.resource_type ,
DB_NAME( resource_database_id) AS dat_name ,
t1.resource_associated_entity_id,
t1.request_mode,
t1.request_session_id,
t2.wait_duration_ms,
( SELECT TEXT FROM sys.dm_exec_requests r CROSS apply sys.dm_exec_sql_text ( r.sql_handle ) WHERE r.session_id = t1.request_session_id ) AS wait_sql,
t2.blocking_session_id,
( SELECT TEXT FROM sys.sysprocesses p CROSS apply sys.dm_exec_sql_text ( p.sql_handle ) WHERE p.spid = t2.blocking_session_id ) AS blocking_sql
FROM
sys.dm_tran_locks t1,
sys.dm_os_waiting_tasks t2
WHERE
t1.lock_owner_address = t2.resource_address
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
613943 次 |
最近记录: |