SQL Server Central is supported by Red Gate Software Ltd.
 
Log in  ::  Register  ::  Not logged in
Search:  
 
 

Identifying Blocking Locks

By Eli Leiba, 2004/10/28

Total article views: 10066 | Views in the last 30 days: 72

This article describes how to identify an update (Blocking) Lock by scheduling a job to run every few minutes and checks if a blocking lock on an object is held from the previous execution of the job to the current job execution

Sometimes, in order to identify a Long time Lock placed on an object that affects the application behavior we need something more powerful than the simple sp_lock because Sp_lock only lists the current locks placed on objects and does not show the locking time. Here I suggest a mechanism that can be scheduled to run every 5 or 10 minutes in order to check if an update (Exclusive Lock) was held on an object for the last 5 or 10 minutes

The first thing to do is to create a table (called BlockingLocks)  in the format of the result Set of the sp_lock system procedure By executing :

Use master 
Go
Create table BlockingLocks 
( spid smallint,
  dbid int,
  ObjId int ,
  IndId int,
  Type  varchar(4),
  Resource varchar(16),
  Mode varchar(8),
  Status varchar(5))
go

-- Next comes the procedure's source code:
Create procedure sp_Identify_Blocking_Locks
as
begin
declare @cntBlocks int

set noCount on 

-- create a temporary table to hold current locks status reported by sp_lock

Create table #CurrLocks 
( spid smallint,
  dbid int,
  ObjId int ,
  IndId int,
  Type varchar(4),
  Resource varchar(16),
  Mode varchar(8),
  Status varchar(5)
)

-- populate temp table
insert #CurrLocks exec sp_Lock

-- select into counter the number of objects still in lock from prev time
select @cntBlocks = count (distinct b.objId)
 from BlockingLocks a join #CurrLocks b
   on a.ObjId = b.ObjId
 where b.Mode like '%X%'

truncate table BlockingLocks

-- fill Blocking locks with the new lock data 

Insert BlockingLocks 
  select * from #CurrLocks where Mode like '%X%'

Drop table #CurrLocks

return (@cntBlocks)

end
go
If the result returned by procedure is > 0 then locks on objects that exceeded job's time interval exist!

Example of a call to the procedure

declare @cnt int

exec @cnt = sp_Identify_Blocking_Locks

print @cnt 

Conclusion

The process I showed here can be used as a tool for identifying blocking locks. By scheduling a job to run this procedure. If a positive result is returned, the DBA must look at the BlockingLocks table to identify the blocking objects.

Eli Leiba works at Israel Electric Company as a Senior Application DBA in Oracle and MS SQL Server. He also has certifications from Microsoft and BrainBench in Oracle and SQL Server database administration and implementation. Mr. Leiba holds a B.S. in Computer Science since 1991 and has 13 years' experience working in the databases field. Additionally Mr. Leiba teaches SQL Server DBA and Development courses at Microsoft CTEC and also serves as a senior database consultant for several Israeli start-up companies. (e-mail:iecdba@hotmail.com)

By Eli Leiba, 2004/10/28

Total article views: 10066 | Views in the last 30 days: 72
Your response
 
 
Related tags
 
Already registered?  

Free registration required

To read the rest of this article, and access thousands of other articles, we ask you to register on the site and subscribe to our newsletters.

Register

E-mail address:
Password:
Password (confirm):

  

Subscriptions

We ask you to register on the site and subscribe to our newsletters. Subscribing to our newsletters gets you:

  • ALL of our content (thousands of articles, scripts, and forum postings)
  • A daily newsletter (example)
  • A weekly news round up (example)
  • The opportunity to ask and answer questions in our forums
  • A daily Question of the Day to test and help you increase your knowledge of SQL Server.

We ask that you give the newsletter a try for a week. Over 200,000 SQL Server Professionals a day find it entertaining and useful. If not, you are welcome to unsubscribe at anytime.

Steve Jones
Editor, SQLServerCentral.com