U bevindt zich nu op een technische pagina over de software Mercator. Deze pagina bevat specifieke informatie die bestemd is voor professionals van de software Mercator. Wenst u naar algemenere informatie over Mercator door te gaan?


   Deze vraag niet meer stellen

Het begrijpen van het fenomeen van een deadlock

0000003202     -      12-04-2024

Een deadlock is een conflict tussen meerdere gebruikers dat wordt geproduceerd en beheerd door de database wanneer twee concurrerende gebruikers transacties zijn gestart die bronnen vereisen die momenteel worden gebruikt door beide gebruikers.

  • De transactie van gebruiker 1 heeft bron A gelockt en wacht tot bron B vrij is voordat hij deze lockt.
  • De transactie van gebruiker 2 heeft bron B gelockt en wacht tot bron A vrij is voordat hij deze lockt.

De bronnen A en B kunnen twee verschillende tabellen zijn, maar ze kunnen ook overeenkomen met verschillende rijen of pagina's in dezelfde tabel. SQL Server heeft een systeem voor het detecteren van dergelijke situaties en om oneindig wachten te voorkomen, wordt een van de twee transacties beëindigd. Aangezien de hele transactie wordt afgebroken, heeft dit geen invloed op de gegevensconsistentie. De "slachtoffer" gebruiker hoeft alleen maar de transactie opnieuw te starten (bijvoorbeeld door opnieuw een back-up aan te vragen).

Dit mechanisme is dus gezond en normaal in een mutli-user omgeving.

Het kan echter zijn dat SQL-programmeerpatronen dit soort situaties bevorderen. Bijvoorbeeld, als een code tabel A bijwerkt en vervolgens tabel B, terwijl op een andere plaats in het programma updates in de omgekeerde volgorde worden uitgevoerd. Wanneer deze situaties zich herhalen en het gebruikersgemak belemmeren, is het noodzakelijk om de oorzaak van de deadlock te begrijpen en deze waarschijnlijk te verhelpen door de SQL code aan te passen.

Dit SQL-script wordt gebruikt om informatie te verkrijgen over deadlocks in de database :

DECLARE @xelfilepath NVARCHAR(260)
SELECT @xelfilepath = dosdlc.path
FROM sys.dm_os_server_diagnostics_log_configurations AS dosdlc;
SELECT @xelfilepath = @xelfilepath + N'system_health_*.xel'
 DROP TABLE IF EXISTS  #TempTable
 SELECT CONVERT(XML, event_data) AS EventData
        INTO #TempTable FROM sys.fn_xe_file_target_read_file(@xelfilepath, NULL, NULL, NULL)
         WHERE object_name = 'xml_deadlock_report'
SELECT EventData.value('(event/@timestamp)[1]', 'datetime2(7)') AS UtcTime, 
            CONVERT(DATETIME, SWITCHOFFSET(CONVERT(DATETIMEOFFSET, 
      EventData.value('(event/@timestamp)[1]', 'VARCHAR(50)')), DATENAME(TzOffset, SYSDATETIMEOFFSET()))) AS LocalTime, 
            EventData.query('event/data/value/deadlock') AS XmlDeadlockReport
     FROM #TempTable
     ORDER BY UtcTime DESC;

 

SourceHow to resolve deadlocks in SQL Server op SQLShack