Ich habe mich gefragt, ob entweder aufgrund der erhöhten Zeilensperre und / oder aufgrund der erhöhten Zeit, die Sperren verbracht wurden, die Wahrscheinlichkeit, einen Deadlock zu haben, wenn ein zusammengesetzter Primärschlüssel auf einer Tabelle definiert wird mehrere Threads gleichzeitig?
Danke für jede Hilfe.
Wenn Sie zusammengesetzte PKs verwenden und große Datenmengen parallel einfügen, werden Sie möglicherweise von der Ressourcehash-Kollision getroffen. Siehe " Der seltsame Fall des zweifelhaften Deadlocks und des nicht so logischen Locks " für ein Beispiel aus der realen Welt.
Und für die Erklärung zu Ressourcenkollision zitiere ich Remus Rusanu in " %% lockres %% Kollisionswahrscheinlichkeit Magie-Marker: 16.777.215 " (empfohlen zu lesen):
Der Sperrmanager in SQL Server weiß nicht, was er sperrt, er sperrt nur 'Ressourcen' (im Grunde Zeichenfolgen). Es ist die Aufgabe von Komponenten auf höherer Ebene, wie die Zugriffsmethoden der Speicher-Engine, die 'Ressource' dem Sperrmanager zu präsentieren und nach der gewünschten Sperre zu fragen. Beim Sperren von Zeilen in einem Heap oder einem B-Baum wird die Speicher-Engine eine 'Ressource' aus der Datensatz-ID synthetisieren. Da diese Ressourcen eine begrenzte Länge haben, muss die Speicher-Engine die effektive Länge eines Schlüssels auf die maximale Länge reduzieren, die dem Lock-Manager angezeigt werden darf, und das bedeutet, dass der Schlüssel des Datensatzes auf 6 Byte reduziert wird. Dies wird durch Hashing des Schlüssels in einen 6-Byte-Hash-Wert erreicht.
[...]
Auf 6 Bytes gibt es 281.474.976.710.656 verschiedene mögliche Werte. Es ist eine ziemlich große Zahl? Eigentlich nicht so groß. [...] Also erzeugt der SQL %%-Lockres %% -Hash zwei Datensätze mit demselben Hash, mit einer Wahrscheinlichkeit von 50%, aus der Tabelle jede Tabelle mit nur 16.777.215.
Da der Lock Manager des SQL Server einen Lockhash-Wert verwendet (nicht die PK direkt), würde ich schlussfolgern, dass es keinen Unterschied beim Sperren mit einer einzelnen Spalten-PK gegenüber einer zusammengesetzten PK gibt.
Im Gegensatz zu einigen anderen Datenbankanbietern gibt es eine logische Komponente für den Lock Manager von SQL Server. SQL Server verwendet einen Lockhash-Wert, um eine Sperre für die Sperrstruktur im SQL Server-Sperr-Manager darzustellen, anstatt die physische Beschreibung für eine Zeile, eine Seite oder eine Tabelle zu verwenden. Der Lockhash-Wert wird dann im Speicher gehalten.
Ich würde keine größere Chance feststellen, eine Hash-Kollision des Lockhash-Wertes von einem einzelnen Spaltenschlüssel gegen einen zusammengesetzten Schlüssel zu bekommen. Wie in der Verknüpfung mit SQL 2008R2 angegeben, wurde der Lockhash deutlich verbessert und Composite-Schlüssel gezielt angesprochen.
Vor 2008R2 war lockhash für einzelne und zusammengesetzte Schlüssel weniger als perfekt.
Es ist eine gute Übung, Ihre PK kurz zu halten.
.NET KeyValuePair und Tuple erzeugen keinen guten Hash.
Im Allgemeinen würde ich dazu neigen, nein zu sagen, nicht mit gut gestaltetem Code. Und der Grund ist, dass die Ursachen von Deadlocks und die Techniken zu deren Vermeidung / Beseitigung im Allgemeinen nicht zeitabhängig sind. Die meisten Deadlocks treten aufgrund unterschiedlicher Updatepfade innerhalb von Threads auf. Zum Beispiel aktualisiert Code A Tabelle 1 und dann Tabelle 2 aktualisieren, während Code Block B eine Aktualisierung Table2 und dann Update Table1 durchführt. Die Techniken, um dies zu vermeiden, beziehen sich darauf sicherzustellen, dass die verschiedenen Codebausteine die Elemente in der gleichen Reihenfolge versuchen und aktualisieren. Mit anderen Worten, vermeiden Sie Szenarien, in denen Thread 1 eine Sperre für A hat und B aktualisieren möchte, während Thread 2 eine Sperre für B hat und A aktualisieren möchte.
Wenn diese widersprüchlichen Codierungsblöcke / Anweisungen existieren, können jedoch zusammengesetzte Schlüssel die Häufigkeit von Deadlocks erhöhen. Grundsätzlich gilt, je länger eine Transaktion dauert, desto mehr Zeit muss ein anderer Thread die andere Ressource sperren und einen Deadlock verursachen.
Abgesehen von einem extrem kleinen / spezifischen Randfall glaube ich nicht, dass zusammengesetzte Schlüssel das Auftreten von Deadlocks beeinflussen würden (zumindest nicht in meinen Erfahrungen).
Tags und Links sql sql-server