Wie lösen lck_m_x Sperren in sql
Ich habe eine komplexe Abfrage (Ohne sperrhinweise), der nimmt die Daten aus vielen Tabellen sagen, Table1,Table2,Table3
Unten ist der code, den code, um Daten abzurufen (es sind keine Transaktionen)
IDbCommand sqlCmd = dbHelper.CreateCommand(Helper.MyConnString, sbSQL.ToString(), CommandType.Text, arParms);
sqlCmd.CommandTimeout = 300;
ds = dbHelper.ExecuteDataset(sqlCmd);
In einer Anwendung diese Abfrage läuft alle 2 Minuten
Wenn ich Feuer eine einfache update-Abfrage, sagen
Update Table1 set Col1='abc' where ID=100
(wo ID ist vom Datentyp int und primary key + clustered index)
die update-Abfrage wird verzögert, und oft ist es timeout
Unten ist der log
Wie kann ich dieses Problem beheben.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnten Sie führen Sie Ihre Abfrage in einer Transaktion mit Isolationsstufe SNAPSHOT. So, deine Abfrage nicht erwerben (shared) sperren und das UPDATE muss nicht warten, bis die exklusive Sperre (vorausgesetzt, dass die Quelle der sperren für die Tabelle, block UPDATE ist wirklich die Abfrage, die die Anwendung läuft alle zwei Minuten...)
Referenz, haben Sie einen Blick auf Arbeiten mit Snapshot-Isolation und SET TRANSACTION ISOLATION LEVEL auf der MSDN-Website.
EDIT wegen Kommentar:
Erste, schalten Sie ALLOW_SNAPSHOT_ISOLATION für Ihre Datenbank:
Dann schreiben Sie Ihre Abfrage wie folgt:
Ist, dass es genug für ein Beispiel?
Wenn Sie nicht wollen, warten, Lesen, Abfragen, während modifing Daten, es wäre am besten zu verwenden READ_COMMITTED_SNAPSHOT.
Kann es sein, transparent auf und wirken sich nicht auf Sie app-code und hat keine Nebenwirkung.
SNAPSHOT hat viele Nebenwirkungen, zum Beispiel, während Sie nicht haben sperren auf der Datenänderungen Sie können die in Konflikt stehende Daten, die Probleme, die auf die Begehung dieser Probleme sehr schwierig zu behandeln.