In der Datenbank stoßen wir häufig auf diese Situation: eine Haupttabelle A und eine Untertabelle B. Tabelle B enthält den Primärschlüssel von Tabelle A als Fremdschlüssel. Wenn wir Daten einfügen möchten, fügen wir sie zuerst in Tabelle A ein, ermitteln dann die Identität von Tabelle A und fügen sie dann in Tabelle B ein. Wenn Sie einen Löschvorgang durchführen möchten, löschen Sie zuerst die Untertabelle B und dann die Haupttabelle A. Bei der Programmierung werden die Operationen an den beiden Tabellen in einer Transaktion abgeschlossen.
Bei häufiger Nutzung des Systems können Einfüge- und Löschvorgänge gleichzeitig erfolgen. Zu diesem Zeitpunkt platziert die Einfügetransaktion zunächst eine exklusive Sperre für die Haupttabelle A und greift dann auf die Untertabelle B zu. Gleichzeitig platziert die Löschtransaktion eine exklusive Sperre für die Untertabelle B und dann Greifen Sie auf die Haupttabelle A zu. Die Einfügetransaktion monopolisiert immer Tabelle A und wartet auf den Zugriff auf Tabelle B, und die Löschtransaktion monopolisiert auch Tabelle B und wartet auf den Zugriff auf Tabelle A. Daher monopolisieren die beiden Transaktionen jeweils eine Tabelle füreinander und warten auf die Freigabe durch die andere Partei Ressourcen, was zu einem Deadlock führt.
Ich habe von drei Möglichkeiten gehört, dies zu tun:
1. Brechen Sie die Fremdschlüsselbeziehung zwischen den beiden Tabellen AB auf, sodass Sie beim Löschen von Daten zuerst die Haupttabelle A und dann die Untertabelle B löschen können, sodass die Die Transaktionszugriffssequenz dieser beiden Tabellenoperationen ist konsistent.
2 Bevor Sie die Daten in Tabelle A löschen, verwenden Sie zunächst eine Transaktion, um den relevanten Fremdschlüssel in Tabelle B auf andere Daten in Tabelle A zu verweisen (erstellen Sie beispielsweise eine Datenzeile in Tabelle A und setzen Sie den Primärschlüssel auf 0. Diese Zeile Auf die Anzahl der Daten wird niemals zugegriffen. Führen Sie einen Löschvorgang durch. Dadurch wird die Beziehung zwischen den zu löschenden Daten in den beiden Tabellen AB aufgehoben. Dann können Sie eine Löschtransaktion verwenden, um zuerst die Daten in Tabelle A und dann die Daten in Tabelle B zu löschen, um einen konsistenten Tabellenzugriff mit der Einfügetransaktion zu erreichen und einen Deadlock zu vermeiden.
3. Stellen Sie in der Fremdschlüsselbeziehung die „Löschregel“ auf „Kaskadierend“ ein, sodass die Löschtransaktion nur die Haupttabelle A direkt löschen muss, ohne die Untertabelle B zu bearbeiten. Denn nachdem die Löschregel auf Kaskade gesetzt wurde, werden die Daten in der Haupttabelle gelöscht und gleichzeitig werden auch alle mit den Fremdschlüsseln in der Untertabelle verknüpften Daten gelöscht.
Die oben genannten drei Lösungen sind alles Vorschläge von Kollegen, und ich weiß nicht, welche Methode verwendet werden soll.
Ich frage mich, ob es in dieser Situation noch andere gute Möglichkeiten gibt, einen Deadlock zu verhindern?
http://www.cnblogs.com/studyzy/archive/2007/06/11/779811.html