Ich habe eine Tabelle, die innerhalb einer Sekunde tausende Male eingefügt, aktualisiert und ausgewählt wird. Ich habe jedoch Deadlock-Probleme.
- Die Datenbank verfügt über 2-5 gleichzeitige 1000+ Zeileneinfügungen mit Linq to Sql.
40 Mal pro Sekunde gibt es auch eine select-Anweisung aus dieser Tabelle. Wenn eine Bedingung erfüllt ist (in 95% der Fälle), erfolgt eine Aktualisierung mit ähnlichem Code:
Prozedur erstellen AccessFile (@code, @admin) AS
deklarieren Sie @id int, @access datetime, @file string
Wählen Sie @ id = Id, @accessed = abgerufen, @file = Datei aus Dateien, in denen code = @code
IF @admin <> 0 IF @accessed ist null begin
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
Aktualisieren Sie den Dateisatz access = getdate (), wobei id = @id
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
Ende
Wählen Sie @id als ID, @file als Datei
Es scheint, als ob es die Aktualisierungen sind, die mit den Einfügungen in Konflikt stehen und die Deadlocks verursachen.
Das Beispiel ist eine 1 zu 1 mit der gespeicherten Prozedur, nur der Unterschied sind die Namen. Nehmen Sie die 1 und 2 an, unabhängig von den Namen der gespeicherten Prozeduren.
quelle
Antworten:
Ändern Sie die Updates, um WITH (ROWLOCK) zu verwenden. Dadurch werden die Sperren von Seitenebene auf Zeilenebene reduziert. Sie können das gleiche auch bei den Einsätzen versuchen.
quelle
Sie können es auch zu Beginn des Prozesses versuchen und die Isolationsstufe auf SNAPSHOT setzen. Weitere Informationen finden Sie unter: http://msdn.microsoft.com/en-us/library/ms173763.aspx
Für die Zeilenversionierung fallen in tempdb einige Kosten an.
quelle
Ich würde die Anwendungen so umgestalten, dass Zeilen in Stapeln gespeichert werden. Normalerweise funktionieren Stapel von 500-1000 Zeilen gut für mich, aber Sie müssen Ihre eigenen Tests ausführen. Bevor ich einen Stapel speichere, serialisiere ich meine Stapelaktualisierungen mit sp_getapplock.
Sicherlich verlangsamt diese Serialisierung die Änderungen ein wenig, aber das Speichern in Stapeln gleicht dies mehr als aus, sodass dies insgesamt viel schneller funktioniert, als wenn Zeilen nacheinander gespeichert werden.
Außerdem würde ich meine Auswahl mit der SNAPSHOT-Isolationsstufe ausführen, damit sie durch Änderungen nicht blockiert werden.
Wenn Sie dies getan haben, haben Sie möglicherweise überhaupt keine Deadlocks - wir haben keine Deadlocks in unserem Mischlastsystem, und Sie auch.
Viel Glück!
quelle