2017-01-25 3 views
2

Ich bin nicht in der Lage, eine deadlock_xml von Azure SQL Server V12 zu verstehen. Hier ist die grafische Darstellung (die mit der zugrunde liegenden XML konsistent ist):SQL Server Deadlock-Grafik: bitte erläutern

enter image description here

  • So ist der rhs Prozess eine Update-Sperre und der LHS Prozess ausgegeben hat, die auch eine Update-Sperre auf derselben Ressource will , muss warten.

  • Dann fordert der rhs-Prozess eine exklusive Sperre für die gleiche Ressource an, die anscheinend aufgrund einer Update-Sperre des lhs-Prozesses blockiert ist (warum? Weil sie einen angefordert hat ??!).

Meine Frage:

Warum der rhs Prozess können die U-Sperre auf eine X-Sperre nicht beschränken?

Ich versuche, dies auf einem hohen Niveau zu verstehen, aber doch sind hier die Besonderheiten:

  • Beide Prozesse liefen die gleiche sp

  • Die sp führt eine Upsert op : Einfügen, wo nicht existiert (Auswählen ...); if @@ ROWCOUNT = 0 Update ...

  • Die Transaktionen waren serialisierbar.

Antwort

1

Beide Aktionen betreffen die gleiche Tabelle. Sie sehen eine Tastensperre auf dem Primärschlüssel-Index "PK_Product".

Ich versuche, es in einem einfachen Beispiel zu setzen:

Ein Mann kommt in einen Raum und sagt: „Ich werde diese Mauer einzureißen“ und geht hinaus, um seine Werkzeuge zu holen. Ein anderer kommt herein und sagt: "Ich werde diese Wand malen!" und geht hinaus um die Farbe zu bekommen. Jetzt kommen beide zurück und wollen die Arbeit beginnen. Derjenige, der die Mauer einreißt, beginnt etwas früher. Für den zweiten Mann hat es keinen Sinn zu warten. Diese Prozesse können nicht serialisiert werden. Er kann nicht warten, bis der erste fertig ist. Die Arbeit des ersten Mannes veränderte die Grundlage seiner Arbeit und machte es unmöglich.

Für Sie bedeutet das: Beide Prozesse sagen: "Wir werden diese Tabelle aktualisieren, aber wir prüfen zuerst auf eine bestimmte Bedingung". Da ein INSERT den Primärschlüssel betrifft, kann der zweite Prozess nicht warten und etwas später fortfahren. Dieser Prozess kann nur beendet und neu gestartet werden.

Sie können sich die MERGE-command ansehen, die es Ihnen ermöglicht, das Upsert in einem einzigen Schritt zu erstellen.

+0

@Shungo Vielen Dank für Ihre Antwort! Es ist mir jetzt klar. Ich war naiv genug, zu erwarten, dass man sich auf eine logische statt auf eine physische Ebene einsperrt. Zusammenführen mit Isolationsstufe "serialisierbar" ist in der Tat die Lösung für mein Problem upsert.Leider habe ich nicht genug rep Ihre Antwort öffentlich zu aktualisieren. – PBof

Verwandte Themen