Resolving Blocking Problems

By Bill Wunder


Blocking is a good thing! Right?


We’re not talking that nasty old deadlocking, just plain old maintain-the-specified-isolation-level blocking.


If it weren’t for resource locking – and the resulting blocking conditions – multiple processes could not be efficiently and accurately manage in the database. Ideally, a process gets its locks, quickly does its SQL business while any other processes are briefly blocked should they have an interest in a locked row/page/extent/table, then releases the locks and all processes go on about their business. No human is even aware of any blocking that may have occurred but everyone gets the data they expected.


Ah the perfect world. It’s a lovely place when you can find it.


Inevitably reality will set in and we will have to deal with database blocking that has become a business problem. In reality there will be blocking problems along with the irrevocable benefits. Most often there is a problem when users see the effects of blocking and when there is a problem they will let you know about it. Sometimes they must simply wait a noticeable amount of time and thus develop a perception that the system is “slow”.  Other times the blocking persists beyond the threshold of the query or connection timeout so the action is aborted and the user may even observe an error message. Most likely the error message will be a “connection timeout” at the application. What constitutes a noticeable amount of wait time or a reasonable connection timeout setting can vary from shop to shop, application to application, and query to query. For some applications a hesitation of only a second or two can not only degrade performance perception but can queue a large number of queries and actually produce a cascading performance impact that can take a significant amount of time to clear after the initial database block is released. For others, a block may go harmlessly unnoticed for minutes or even hours. The moment of unacceptable slowness for a connection - that duration when an error message would be favorable to a continuation of the pause of the blocked user’s process – is really the duration that the query/connection timeout should be set. However - again pulling us back to reality - it is not uncommon to find query/connection timeout thresholds set to “never”. In fact, SQL Server defaults the query timeout to “never” and depends on the application connection to establish the appropriate setting.


So what can we DBAs provide in terms of lock administration?  Implicitly we can gain an understanding of how the Storage Engine manages concurrency, how to avoid and reduce blocking, and how effectively each particular application in our shop that uses a database with a blocking problem is designed. If we go into a blocking problem resolution effort with good fundamentals in these areas we are in an ideal place to get the job done. SQL Server Books Online is a good place to begin a study of the SQL Server Locking Architecture. Of particular note are the articles “Understanding and Avoiding Blocking” and “Locking Architecture.“  There are a number of web sites and books available with more in-depth discussions of locking. I recommend consulting as many sources as you can dig up. It is a fairly complex topic and the more voices you can add to your understanding the higher quality will be the knowledge.


Almost always blocking is going to be an application issue and resolution will come from a change in application behavior. In some cases a revision of indexing is the cure, in other cases a more sweeping application revision is needed. This means that the developers will expend more energy in the resolution phase of the problem and the DBA will expend more energy in identification and control phase of a blocking problem investigation. As a DBA you need to be able to lay out the information to the developer: A is blocking B and here is why. Perhaps together you can brainstorm the solution possibilities. Then the developer must implement and test the revision to assure the behavior of the application.


The first thing to be done to control a block has to be to understand the block. Catching a block in situ provides the best opportunity to fully understand any block, determine if it’s a block you can live with or a block that is unacceptable, and then if necessary master the blocking condition. A good test of the level of understanding of a block is the ability to reproduce the block at will. Interestingly, once you can make a block happen intentionally you can control the block. Once the lock is controlled it can be manipulated as necessary. Being in control of the block is the key to effective lock administration.


SQL Server offers some tools that can help: sp_who, and sp_lock can both provide a point in time view of a block condition. Sometimes Profiler can prove useful though be aware that locking information can produce some voluminous output.


Catching a block in action can sometimes be a challenge. I find using a stored procedure I’ve put together in the SQL Agent Job Scheduler to monitor the system for blocks very effective. I use the procedure GetBlockingDetails in a SQL Agent job scheduled to run every minute. Once a minute it scans sysprocesses for any blocked spids. If it doesn’t find any it’s done until the next minute. If it finds a block it identifies the lead blocking spid and logs it to a table and then waits 30 seconds (change the delay periods as necessary ti suit your needs) and checks again to see if the block is persisting. If so, it captures sysprocesses data for all blocked spids involved in the block to a table and shoots off an email letting me know there is an interesting blocking episode happening. After another 30 seconds it checks that the block is ongoing and if so it shoots me off an email telling me the block is a doozey. Then the procedure goes into a loop checking for the block once a minute until it sees the block has cleared at which time it sends me one more email and then starts watching for the next block. This has proven very helpful for me.


What works best in your shop and for your applications is know best by you. Hope you found some useful information and at least a few building blocks for becoming the ultimate lock administrator wherever you are.