Troubleshoot Database Concurrency in SQL Server with sp_locks


Usage

–Return only the second result set

EXEC sp_Locks @Mode = 1, @Wait_Duration_ms = 1000;

– Return the first and second result sets

EXEC sp_Locks @Mode = 2, @Wait_Duration_ms = 1000;

– Return all three result sets

EXEC sp_Locks @Mode = 3, @Wait_Duration_ms = 1000;


Capture blocking information to table

To save blocking information to table use the provided script Capture_blocking_info.sql which uses an INSERT…EXEC statement with sp_locks in @Mode = 2.


Inside the locks

To get an insight view into a process that is blocked or blocking and returned by sp_locks you can use the bellow script that details the reason for why that process is blocked or blocking.

I use it when I troubleshoot and reproduce a blocking scenario while filtering on the relevant spid so I can see only the data I am interested in and then get a picture of the granted resources and their lock mode.

SET NOCOUNT ON;

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

SELECT –TOP 100

       l.request_session_id AS spid

      ,DB_NAME(l.resource_database_id) AS [database]

      ,CASE WHEN l.resource_type = ‘OBJECT’ THEN OBJECT_NAME(l.resource_associated_entity_id, l.resource_database_id)

                        WHEN l.resource_associated_entity_id = 0 THEN ‘NA’ ELSE OBJECT_NAME(p.object_id, l.resource_database_id) END AS [object]

      ,p.index_id

      ,l.resource_type        AS [resource]

      ,l.resource_description AS [description]

      ,l.request_mode         AS [mode]

      ,l.request_status       AS [status]

      ,l.resource_associated_entity_id

FROM sys.dm_tran_locks l

LEFT JOIN sys.partitions p ON p.hobt_id = l.resource_associated_entity_id

WHERE resource_type NOT LIKE ‘DATABASE’

–AND l.request_session_id = @@SPID – <—- edit spid here

–AND DB_NAME(l.resource_database_id) NOT LIKE ‘distribution’

When running the script on the test scenario while filtering on the database name so I get to see all processes involved it clearly shows that the lead blocker process, spid 218 holds an exclusive (X) lock on an index key (clustered index in this case)  and this is the actual lock on the row being updated. The exclusive row lock has also to be marked at the page level and this is done with an Intense Exclusive (IX) lock and you can see that this is page number 154 in data file number 1. The Intense Exclusive (IX) page lock has also to be marked at the table level and that is done with Intense Exclusive (IX) lock on the object resource.

All the other processes trying to read the data are in a WAIT status on the KEY resource held by the UPDATE statement.


Permissions

The DMVs (Dynamic Management Views)  and DMF (Dynamic Management Function) used by the stored procedure requires the caller to have the VIEW SERVER STATE permissions and of course the permissions to EXECUTE the procedure in the master databases.

/*

USE [master];

GRANT VIEW SERVER STATE TO Paul;

GRANT EXECUTE ON sp_locks TO Paul;

*/

—————–

Download the Capture Block Info sql script here

Download the sp_Locks sql script here

Download the test script here

Pages: 1 2




Related Articles :

  • No Related Articles Found
Uncategorized

No comments yet... Be the first to leave a reply!

Software Reviews | Book Reviews | FAQs | Tips | Articles | Performance Tuning | Audit | BI | Clustering | Developer | Reporting | DBA | ASP.NET Ado | Views tips | | Developer FAQs | Replication Tips | OS Tips | Misc Tips | Index Tuning Tips | Hints Tips | High Availability Tips | Hardware Tips | ETL Tips | Components Tips | Configuration Tips | App Dev Tips | OLAP Tips | Admin Tips | Software Reviews | Error | Clustering FAQs | Performance Tuning FAQs | DBA FAQs |