![]() |
|
|
By: Greg Robidoux | Read Comments (2) | Print Greg is the President of Edgewood Solutions and a co-founder of MSSQLTips.com. Related Tips: More |
|
Problem
One thing that will you most certainly face at some time as a DBA is dealing with deadlocks. A deadlock occurs when two processes are trying to update the same record or set of records, but the processing is done in a different order and therefore SQL Server selects one of the processes as a deadlock victim and rolls back the statements.
For example you have two sessions that are updating the same data, session 1 starts a transaction updates table A and then session 2 starts a transaction and updates table B and then updates the same records in table A. Session 1 then tries to update the same records in table B. At this point it is impossible for the transactions to be committed, because the data was updated in a different order and SQL Server selects one of the processes as a deadlock viticm.
To further illustrate how deadlocks work you can run the following code in the Northwind database.
| To create a deadlock you can issue commands similar to the commands below. | |
| Step | Commands |
| 1 | --open a query window (1) and run these commands
begin tran |
| 2 | -- open another query window (2) and run these commands
begin tran |
| 3 | -- go back to query window (1) and run these commands
update employees set firstname = 'Greg' At this point SQL Server will select one of the process as a deadlock victim and roll back the statement |
| 4 | --issue this command in query window (1) to undo all of the changes
rollback |
| 5 | --go back to query window (2) and run these commands to undo changes
rollback |
Solution
The only solution for handling deadlocks is to find the problem in your code and then modify your processing to avoid deadlock situations. The first thing you need to do is find the deadlock situations and then investigate the problem. There are a couple of ways of doing this.
The first approach is to turn on the trace flag to find the deadlocks. This can be done with the following statement run in Query Analyzer.
| DBCC TRACEON (1204) |
When a deadlock occurs the information like the following will be captured in the SQL Server Error Log.

From this output we can see that SPID 53: was updating object 1977058079 and SPID 52: was updating object 117575457. But what do these numbers mean. These numbers are the objectIDs. To determine what table is affected you will need to query the sysobjects table in the Northwind database or whatever user database the deadlock occurred in using the following command and the find the ID that matches the ID from the deadlock information.
|
SELECT id, name SELECT object_name(1977058079) --(returns Employees) |
With this information it is possible to see what tables were part of the deadlock process, but trying to figure out what statements caused the problem is much more difficult. To provide further information about the deadlock process you will need to run a Trace to capture all of the information and then try to decipher what is going on. This can be done by either using Profiler or by using a Server Side Trace. With the trace there are a couple of additional items that need to be captured to help figure out what is going on and with what objects.
SQL Profiler
To do this using SQL Profiler, you will need to capture the Lock Events Lock:Deadlock and Lock:Deadlock Chain.

And also capture the ObjectId data column.

Server Side Trace
For a Server Side Trace the following additional information will need to collected to capture the deadlock information.
| EventNumber | Event | Description |
| 25 | Lock:Deadlock | Indicates that two concurrent transactions have deadlocked each other by trying to obtain incompatible locks on resources the other transaction owns. |
| 59 | Lock:Deadlock Chain | Produced for each of the events leading up to the deadlock. |
In addition, you will also need to capture this additional column to see what objects are part of the deadlock chain.
| ColumnNumber | Column | Description |
| 22 | ObjectID | System-assigned ID of the object. |
The output from our trace would show the following information:

From here we can see what was occurring at the time of the deadlock. This is a very simple example, but you can see how this additional information from a trace can help solve the problem.
When you have a lot of information to go through it is easier to load the data into a SQL Server table and then query the data for the particular timeframe and SPIDs in question. This was covered in a Server Side Trace tip. Here is a sample query that can help you narrow down the timeframe when the deadlock occurred. By changing the date values and the SPIDs to look at you can narrow down what was occurring at the time or right around the time that the deadlock occurred.
DECLARE @lowDate AS datetime, @highDate AS datetime |
Next Steps
| Share: | Share | Tweet |
|
![]() |
![]() |
Free SQL Server Learning |
| Thursday, December 04, 2008 - 6:26:42 PM - Charan | Read The Tip | |||||||||||||||
|
Hi, I followed the below steps to generate the dead lock scenario. All commands ran fine. But I did not get any Deadlock graph in the Error log? Could you plz tell me where Iam going wrong?
Solution The first approach is to turn on the trace flag to find the deadlocks. This can be done with the following statement run in Query Analyzer.
|
||||||||||||||||
| Thursday, December 04, 2008 - 6:38:39 PM - aprato | Read The Tip |
|
Try issuing DBCC TRACEON(3605) prior to DBCC TRACEON(1204)
|
|
|
privacy | disclaimer | copyright | advertise | about authors | contribute | feedback | giveaways | user groups Some names and products listed are the registered trademarks of their respective owners. Edgewood Solutions LLC | MSSharePointTips.com | MSSQLTips.com |