Jeg har netop flyttet den fysiske placering af en SQL Server, som primært har til opgave at håndtere MS CRM. I den forbindelse stødte jeg på en kedelig fejl, som kan betyde tab af data...den skal vi lige kigge nærmere på.
Problemet
Event Vieweren viser følgende meddelelse:
Host SQLSRV012: error while processing organization c99bfbfa-4253-de11-bd20-001e0bbc75ef. Exception: System.Data.SqlClient.SqlException: Transaction (Process ID 67) was deadlocked on lock resources with another process and has been chosen as the deadlock victim.
Det handler altså om deadlocking og deadlock victim, men hvad er det så?
Hvad er deadlocking?
Deadlocking opstår, når to processer forsøger at låse på samme objekter i SQL Serveren, for at udføre handlinger på objektet. Når dette sker, vil SQL Server identificerer problemet og eventuelt afslutte den proces, der i første omgang havde låst objektet, så den anden proces kan udføre sit arbejde. Det afbrudt transaktionen bliver rullet tilbage og en fejlmeddelelse oprettes for den mislykkede proces. En sådan fejlmeddelelse kan ses herover.
Det er ikke nødvendigvis sådan, at det altod er den første proces, der bliver afbrudt til fordel for den anden proces. Som udgangspunkt er det sådan, at den proces, der kræver mindst overhead ved rollback, er den proces der bliver afbrudt, og det er den som er "deadlock victim".
Læs mere om deadlocks i følgende artikel (engelsk): http://msdn.microsoft.com/en-us/library/ms177433.aspx
Løsning af problemet
I MS CRM er det MSCRMAsyncService, som ofte vil forårsage problemet. Det kan dog også være egne eller tredjeparts applikationer.
Hvis det er MSCRMAsyncService som er årsagen til problemet kan problemet ofte løses ved at allokere mere tid til OLEDB Connection'en. I efterfølgende eksempel vil vi ligeledes sætte den tid ASP.NET har til at importere data (hvilket MSCRMAsyncService jo også er ansvarlig for), dog er denne indstilling ikke den sandsynlige årsag til problemet, det er OLEDB Connection'en.
Gør følgende:
- På MS CRM Serveren: Klik på Start, klik på Run, indtast Regedit, og klik på knappen OK.
- Find følgende registreringsnøgle: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSCRM
- Klik, med den højre musknap, på MSCRM, og vælg New. Klik på DWORD Value. På 64-bit servere vælges DWORD (32-bit) Value.
- Navngiv DWORD Value'n OLEDBTimeout.
- Klik, med den højre musknap, på den netop oprettede key; OLEDBTimeout, og vælg Modify.
- I dialogboksen Edit DWORD (32-bit) Value markeres alternativet Decimal, og værdien 86400 indtastes i feltet Value data.

Værdien 86400 svarer til 24 timer
- Klik atter, med den højre musknap, på MSCRM, og vælg New. Klik på DWORD Value. På 64-bit servere vælges DWORD (32-bit) Value.
- Navngiv DWORD Value'n ExtendedTimeout.
- Klik, med den højre musknap, på den netop oprettede key; OLEDBTimeout, og vælg Modify.
- I dialogboksen Edit DWORD (32-bit) Value markeres alternativet Decimal, og værdien 1000000 indtastes i feltet Value data.

BEMÆRK: Værdien der indtastes bør ikke være højere end 2.147.483.647
Om OLEDBTimeout
OLEDBTimeout angives i sekunder. Standard er OLEDBTimeout 30 sekunder. Værdien angiver hvor lang tid SQL Serveren har til at gennemføre en forespørgsel (query). Forøgelse af OLEDBTimeout er nyttig hvis SQL Serveren er overbelastet.
Om ExtendedTimeout
ExtendedTimeout angives i millisekunder. Standard er ExtendedTimeout 1000000 millisekunder. Værdien for ExtendedTimeout styrer hvor lang tid ASP.NET har til at håndtere importopgaver, såsom import at tilretninger eller data. Forøgelse af ExtendedTimeout er nyttig hvis man vil importere mange data i MS CRM. Værdien til ExtendedTimeout skal være længere end den tid det tager at importere dataene.