Logga deadlocks

Oopps! Upgrade your browser pretty please. Oopps! Upgrade your browser pretty please.

Om du misstänker att du har problem med deadlocks är det något du bör ta tag i så snabbt som möjligt!

När du väl konstaterat att du faktiskt har deadlocks blir nästa steg att ta reda på mera detaljer kring dessa. Mer specifikt så vill du naturligtvis veta vilken kod som är orsaken och vilka tabeller som är inblandade.

En variant för att ta reda på mer är att starta en trace och lägga till följande events:
Deadlock graph
Lock:Deadlock
Lock:Deadlock Chain

Som vi alla redan känner till så får vi med dessa events en grafisk bild över eventuella deadlocks vilket kan vara bra hjälp när man försöker ringa in problemet.

Jag tänkte här istället slå ett slag för en annan variant och det är att starta traceflagga 1204 eller 1222. Dessa loggar all info kring deadlocks i SQL Server loggen. Man kan välja att enabla båda flaggorna eller bara en av dem om man vill. Båda levererar lite olika, men nödvändig, information för att felsöka deadlocks.

Vi kan tex ur loggen utläsa vilken process som är “deadlock victim”, vilken kod som körts av båda parter i låsningen, vilken isolationsnivå vi hade mm.

Personligen föredrar jag denna framför den grafiska presentationen i Profiler när det gäller att snabbt spåra deadlocks, dessutom behöver jag inte starta och bevaka en trace utan kan i efterhand titta i loggen.

Dessa traceflaggor måste aktiveras på global nivå EX:

DBCC TRACEON(1222, -1), alternativt lägga till T1222 som en startup parameter för att säkerställa att loggning fortsätter även efter en omstart av SQL Server.

För en mer ingående förklaring av de olika alternativen:
http://msdn.microsoft.com/en-us/library/ms178104(SQL.105).aspx