it-swarm.com.de

Wie kann Deadlock bei SELECT-Abfragen verhindert werden?

Ich habe eine DB mit mehreren Sitzungen. Nur wenige Sitzungen, in denen viele Zeilen in die Datenbank eingefügt werden. und eine Sitzung wählt aus dieser Tabelle aus.

Manchmal bekomme ich einen Deadlock bei der SELECT-Abfrage und verstehe nicht warum.

Zum Beispiel: Nehmen Sie diese Tabelle an

Create Table t1([id] int identity(1,1), [column] varchar(max))

Einfügungen gehen folgendermaßen vor: (Ich mache es von einem 'After'-Trigger aus)

Begin Transaction
Insert into t1 WITH (TABLOCKX) ([column]) values ('value 1'), ('value 2') ... ('value N')
Commit Transaction

Die Auswahl sieht folgendermaßen aus:

Select TOP 10 [id],[column] from t1 order by id

Die Sperre für die Einfügungen sollte die Reihenfolge der Sitzungseinfügungen in der Datenbank beibehalten.

Jedes Mal sperre ich nur eine Tabelle in einer Transaktion. Ich habe versucht, den Deadlock durch Einfügen einer Sitzung und Auswählen einer zweiten Sitzung wiederherzustellen, bin jedoch gescheitert. Bevor ich die TABLOCKX hinzugefügt habe, habe ich nie den Deadlock.

Meine Fragen sind also:

  1. Wie kommt es, dass ein Deadlock möglich ist? (Vielleicht in einer verschachtelten Transaktion?)
  2. Gibt es in MSSQL eine Option, eine Schreibsperre so durchzuführen, dass die Auswahl nicht blockiert wird?
  3. Irgendeine Idee, um einen Deadlock zu verhindern? (aber die Einfügefolge der Sitzung in der Datenbank ohne Änderungen beibehalten ...)
3
SHR

Ich kann ohne die Abfragen oder ein Deadlock-Diagramm nicht viel über Ihre Deadlocks sagen.
Gibt es einen Grund, warum Sie eine exklusive Tabellensperre angeben?
SQL Server ist sehr gut darin, Sperren von Zeile oder Seite zur Tabelle selbst zu eskalieren.

Gibt es in MSSQL eine Option, eine Schreibsperre so durchzuführen, dass die Auswahl nicht blockiert wird?

Ja, Sie können READ COMMITTED SNAPSHOT ISOLATION LEVEL aktivieren.
Mit dieser Isolationsstufe können Sie immer lesen, was festgeschrieben ist. Wenn in diesem Moment eine andere Abfrage geschrieben wird, sehen Sie den neuesten Schnappschuss dessen, was geschrieben wurde.
Bitte lesen Sie die MSDN-Seite durch und prüfen Sie, ob RCSIL für Ihre App funktioniert.

6
DrTrunks Bell