Ich habe ein Deadlock-Diagramm von einem Deadlock, bei dem ein Prozess ein SELECT und einer ein UPDATE ausführt. Dies scheint der klassische Fall zu sein, in dem SELECT eine NCI-Sperre erhält, um einen Join durchzuführen, und dann eine CI-Sperre, um alle Daten durch Nachschlagen abzurufen. Das UPDATE verwendet die CI-Sperre, um eine Aktualisierung durchzuführen, und muss dann eine NCI sperren, da die Aktualisierung zu einer Statusänderung führt und die NCI das Auffinden von Elementen nach Status erleichtert.
Das Problem ist, dass sich eine der Sperren, die das UPDATE wünscht, NICHT in der Tabelle befindet, die aktualisiert wird, und ich kann nicht herausfinden, warum dies geschieht.
Hier ist die AUSWAHL:
SELECT *,
RIGHT(c.CC_NUMBER, 4) AS CC_LAST_4,
DATEDIFF(ss, '1970-01-01', plan_started ) plan_started_epoch,
DATEDIFF(ss, '1970-01-01', plan_expires ) plan_expires_epoch
FROM customers c, accounts a, parent_cos pc, htt_customers_overlay_ultra u
WHERE c.customer_id = a.customer_id
AND u.customer_id = c.customer_id
AND a.cos_id=pc.cos_id
AND u.customer_id = 9300;
Hier ist das UPDATE:
UPDATE htt_customers_overlay_ultra SET plan_state = 'Active' WHERE customer_id = 9300;
Gemäß dem Deadlock-Diagramm erhält das UPDATE jedoch eine Sperre für ACCOUNTS.ACCOUNT0, die PK (CI) der Tabelle ACCOUNTS. Die Overlay-Tabelle enthält keine Fremdschlüssel. Es gibt einige Standardeinschränkungen, für die ich derzeit keine Berechtigung habe.
Ich habe mir das Deadlock-Diagramm in SSMS und in SQL Sentry Plan Explorer Pro angesehen und bin nicht klüger.
Hier sind die Ausführungspläne:
Ich möchte herausfinden, warum es diese Sperre erhält, und dann den besten Weg, um diese Anrufe zu serialisieren.
Dinge, die mir bekannt sind und die ich dem Kunden bereits mitgeteilt habe, die sich auf die genommenen Schlösser auswirken, aber nicht erklären, welche scheinbar nicht verwandte Schlösser entstehen:
Entfernen Sie * und identifizieren Sie die benötigten Spalten und ändern Sie die NCIs, um sie abzudecken. Dies würde möglicherweise dazu führen, dass SELECT weniger Sperren verwendet
Stellen Sie fest, warum das System dieselben Daten auswählt, die von einem anderen Prozess verarbeitet werden. Dies würde möglicherweise die beiden Prozesse verringern, die gleichzeitig ausgeführt werden
In SELECT befindet sich ein Tabellenscan
SELECT
hat U
der PK-Index eine Sperre von htt_customers_overlay_ultra
- warum? Für diesen Prozess wird 0 Protokoll verwendet.
process589f948
) hat eine U
Sperre und versucht, es in eine X
Sperre umzuwandeln , wird aber durch eine S
Sperre blockiert , die von SELECT
( process5240988
) gehalten wird
read_committed_snapshot
.
X
Tastensperre für "dbo.ACCOUNTS" von einer früheren Anweisung in derselben Transaktion erhalten haben, die in der Grafik nicht dargestellt ist?