Deadlock analyse in Business Central

Deadlock analyse in Business Central
Deadlock analyse in Business Central

Een gebruiker meldt dat een boeking mislukt, maar bij de tweede poging lukt hij wel. Je herkent het patroon: zo’n storing komt en gaat, en laat nauwelijks sporen achter. Vaak zit er een deadlock of een lock timeout achter. Een goede deadlock analyse in Business Central begint daarom met één vraag: hoe reproduceer je het probleem op commando? De Deadlock Simulator beantwoordt die vraag. Deze AL-extensie veroorzaakt deadlocks en lock timeouts met opzet, zodat je ze rustig in een sandbox kunt onderzoeken via KQL.

Zo veroorzaak, vind en begrijp je deadlocks en lock timeouts met de Deadlock Simulator.

Wat is een het, en waarom is Deadlock analyse in Business Central zo lastig?

Een deadlock ontstaat wanneer twee sessies elk een record vasthouden dat de ander nodig heeft. Sessie A wacht op sessie B, en sessie B wacht op sessie A. Geen van beide kan verder. SQL Server herkent die cirkel binnen enkele seconden, kiest één sessie als slachtoffer en draait de transactie van dat slachtoffer terug. De andere sessie loopt vervolgens gewoon door.

Daarom is analyse lastig. Het probleem hangt namelijk af van timing: je ziet het alleen wanneer twee processen op precies het verkeerde moment dezelfde records raken. Bovendien meldt de gebruiker alleen een foutmelding, terwijl de oorzaak bij een andere sessie ligt die niemand ziet.

Deadlock of lock timeout: wat is het verschil?

Beide problemen lijken op elkaar, maar ze werken anders.

  • Deadlock: twee sessies wachten wederzijds op elkaar. SQL Server grijpt zelf in en breekt één sessie af.
  • Lock timeout: één sessie houdt een lock te lang vast, bijvoorbeeld tijdens een trage batchjob. Een tweede sessie wacht tot de lock timeout verloopt (in Business Central online standaard 30 seconden) en krijgt dan een foutmelding.

Beide problemen laten sporen na in de telemetrie. Business Central logt een deadlock als event RT0028, een lock timeout als RT0012 en een lock snapshot als RT0013. Je moet die sporen echter wel kunnen uitlokken en herkennen. Precies daar helpt de simulator. In een andere blog post bekijken we de gegenereerde deadlock en lock timeouts via KQL.

Wat doet de Deadlock Simulator precies?

De Deadlock Simulator is een extensie voor Business Central die opzettelijk vergrendelingsproblemen veroorzaakt. Hij werkt op een eigen testtabel met vijf rijen, dus hij raakt geen standaardtabellen. Je kiest op een pagina een scenario, waarna de extensie meerdere achtergrondsessies start. Elke sessie krijgt een rol en vergrendelt rijen volgens een vast patroon. Vervolgens legt de extensie per sessie vast hoe het afliep en hoe lang het duurde. Foutregels kleuren rood in de log.

De vier scenario’s

ScenarioWat de extensie doetWat je ziet
DeadlockTwee sessies vergrendelen rij 1 en 2 in omgekeerde volgordeSQL Server kiest een slachtoffer; die sessie krijgt een deadlock-fout
Row lock timeoutSessie A wijzigt rij 1 en houdt de lock vast. Sessie B wil dezelfde rij wijzigenSessie B wacht tot de timeout en krijgt een foutmelding
Table lock timeoutSessie A vergrendelt alle rijen met LockTable. Sessie B wil een andere rij wijzigenSessie B loopt toch vast, ook al raakt hij een andere rij
Blocking chainSessie A houdt rij 1 vast terwijl twee andere sessies achter elkaar wachtenBeide wachters lopen tegen de timeout aan, terwijl A de oorzaak blijft

Bij de timeout-scenario’s houdt de blokkerende sessie de lock standaard 45 seconden vast. Dat is bewust langer dan de timeout van de omgeving. Zo gebeurt het in het echt ook: een transactie duurt te lang, terwijl iemand anders dezelfde data nodig heeft.

Hoe werkt de extensie onder de motorkap?

De extensie volgt een duidelijke volgorde:

  1. Eerst maakt een beheercodeunit per scenario een aantal taken aan, met een rol, een rij en een vertraging per sessie.
  2. Daarna start de extensie voor elke taak een achtergrondsessie met StartSession.
  3. Vervolgens voert elke sessie zijn rol uit: een rij of tabel vergrendelen en vasthouden, op een lock wachten, of twee rijen in een vaste volgorde vergrendelen.
  4. Ten slotte vangt de sessie een eventuele fout op, meet de duur en schrijft het resultaat naar de log.

De pagina wacht standaard tot alle sessies klaar zijn en toont dan een samenvatting met de eerste fout. Wil je dat liever niet, dan zet je in de setup Wait For Result uit. Daarnaast stel je in de setup de houdtijd, de startvertraging van de wachter en de vertraging in het deadlock-scenario in.

Eigen telemetrie voor zekerheid

De platformtelemetrie toont bij een deadlock alleen het slachtoffer. Daarom stuurt de extensie ook eigen events naar Application Insights, van DL0001 (job gestart) tot DL0006 (lock wordt vastgehouden). Elk event bevat het run-nummer, het scenario, de rol, de sessie en de rij. Hierdoor weet je achteraf precies welke sessie welke rij vastzette, en dus wie de veroorzaker was.

Waarvoor is de Deadlock analyse Simulator in Business Central bedoeld?

De simulator dient uitsluitend voor testen en leren. Je gebruikt hem bijvoorbeeld om:

  • telemetrie en alerts te testen: je controleert of je monitoring een deadlock of lock timeout daadwerkelijk opmerkt;
  • KQL te oefenen: je draait de analyse-queries op echte events in plaats van op theorie;
  • dashboards te valideren: je ziet of een Power BI-rapport over locks de juiste gegevens toont;
  • foutafhandeling te testen: je kijkt hoe je eigen code reageert wanneer een transactie mislukt;
  • collega’s op te leiden: je laat zien hoe een blocking chain ontstaat, zodat het concept blijft hangen.

De extensie is dus nadrukkelijk niet bedoeld voor productie.

Deadlock analyse in Business Central: zo doe je dat!

Kies eerst een scenario en wacht tot de samenvatting verschijnt. Wacht daarna enkele minuten, want telemetrie komt met vertraging binnen. Open vervolgens in Application Insights de logs en draai de queries.

  • Zoek deadlocks op via RT0028. Dat event toont het slachtoffer, het AL-object en het SQL-statement.
  • Zoek lock timeouts op via RT0012 en koppel ze via de snapshotId aan RT0013. Zo zie je welke SQL-sessie de lock vasthield.
  • Leg daarnaast de eigen events DL0001 tot en met DL0006 ernaast. Daarmee bevestig je de veroorzaker.

Zo leer je het verschil tussen een slachtoffer en een veroorzaker. Dat onderscheid is in de praktijk vaak de sleutel tot de oplossing.

Veilig testen: wat je moet weten

  • Gebruik de simulator uitsluitend in een sandbox of testomgeving.
  • De extensie vergrendelt alleen rijen in zijn eigen tabel, dus andere gebruikers merken er niets van.
  • De sessies blijven bij de timeout-scenario’s ongeveer een minuut actief.
  • Controleer vooraf het object-ID-bereik. Een conflict met een andere extensie voorkom je door in app.json een afwijkend bereik te kiezen.
  • Wijs de permissieset DL SIMULATOR toe aan iedereen die de simulator gebruikt.

Conclusie

Deadlocks en lock timeouts zijn lastig, omdat je ze zelden op het juiste moment ziet. De Deadlock Simulator lost dat op: hij veroorzaakt ze op commando, legt vast wat er gebeurt en levert de telemetrie waarmee je ze leert analyseren. Kortom, wie goede deadlock analyse in Business Central wil doen, oefent eerst in een veilige omgeving en zoekt daarna pas in productie naar de echte oorzaak.

Wil je alvast meer weten over database deadlock trace telemetry, klik dan hier. Wil je alvast meer weten over database lock timeout trace telemetry, klik dan hier. Tot slot als je vragen hebt voor de Digitale Mels, neem dan contact met mij op via de contact pagina.

0 Shares:
You May Also Like