Friday, 20 February 2015

SQL SERVER – Quickest Way to Identify Blocking Query and Resolution – Dirty Solution


As the title suggests, this is quite a dirty solution; it’s not as elegant as you expect.
The Story:
I got a phone call at night (11 PM) from one of my old friends, requesting a hand. He asked me if I could help him with a very strange situation. He was facing a condition where he was not able to delete data from a table. He already tried to TRUNCATE, DELETE and DROP on the table, but still no luck. I demanded him to let me access it; however, he had to say “No” due to security reasons. Even though he really wanted my help, he was not authorized to even let me glance at his screen. After doing some background checks about the problem, I realized that he had open transactions somewhere, and this finally led to the solution of the issue. In his case, there was a transaction which was unnecessarily open, and was actually open for a long time now. It was safe for him to kill the transaction, so he killed it and everything moved on.
However, killing transactions can be too damaging to your server, so do not use this method; there are other (and safer) ways.
Here is the script we used to identify the blocking query.
SELECTdb.name DBName,tl.request_session_id,wt.blocking_session_id,OBJECT_NAME(p.OBJECT_IDBlockedObjectName,tl.resource_type,h1.TEXT AS RequestingText,h2.TEXT AS BlockingTest,tl.request_modeFROM sys.dm_tran_locks AS tlINNER JOIN sys.databases db ON db.database_id tl.resource_database_idINNER JOIN sys.dm_os_waiting_tasks AS wt ON tl.lock_owner_address wt.resource_addressINNER JOIN sys.partitions AS ON p.hobt_id tl.resource_associated_entity_idINNER JOIN sys.dm_exec_connections ec1 ON ec1.session_id tl.request_session_idINNER JOIN sys.dm_exec_connections ec2 ON ec2.session_id wt.blocking_session_idCROSS APPLY sys.dm_exec_sql_text(ec1.most_recent_sql_handleAS h1CROSS APPLY sys.dm_exec_sql_text(ec2.most_recent_sql_handleAS h2
GO
The query above returned us the following results:
In our case, we killed the blocking_session_id after carefully looking at the BlockingText; it was found to be not necessary at all. We killed the session using the following command:
KILL 52
As mentioned earlier, if you kill something important on your production server, there’s a great possibility that you’ll face some serious integrity issues, so I there’s no way I advise use this method. As the title goes, this is a dirty solution so you must utilize this only if you are confident.

No comments:

Post a Comment