Ich habe ein transaktionsbezogenes Problem in einer SQL Server 2008-Produktionsdatenbank festgestellt. Eine kurze Übersicht ist, dass wir eine Website haben, auf der zahlreiche Benutzer im ganzen Bundesstaat gleichzeitig arbeiten und die über eine ASP.Net-Website GUI-ähnliche Arbeiten (Hinzufügen von Datensätzen, Ändern, Anzeigen usw.) ausführen.
Jedes Einfügen und Aktualisieren erfolgt in einer eigenen Transaktion, die von der Datenzugriffsschicht verwaltet wird. Ich glaube, die Datenbankisolation ist auf Read_Commited gesetzt.
Alles funktioniert gut.
Es wurde jedoch ein neues Modul hinzugefügt, das eine separate Datenbank nach Informationen abfragt. Wenn neue Informationen vorhanden sind, startet ein Prozess eine neue Transaktion und verwendet denselben Datenzugriffscode zum Lesen aus unserer Datenbank sowie zum Lesen der neuen Informationen aus einer anderen separaten Datenbank. Anschließend werden zahlreiche Überprüfungen durchgeführt, um festzustellen, was mit den neuen Daten geschehen muss. Anschließend werden zahlreiche Aktualisierungen oder Einfügungen in unsere Datenbank vorgenommen. Dies ist alles innerhalb einer großen Transaktion. Alle Einfügungen und Aktualisierungen sowohl der UI-Anwendung als auch des Abfragedienstes durchlaufen dieselben CRUD-Verfahren. Da eine eingehende Nachricht, die verarbeitet werden soll, viele Entitäten enthalten kann, die aktualisiert werden müssen, kann die Zeit für den Abschluss einer Transaktion zwischen einem Sekundenbruchteil und einer Minute liegen.
Wir stellen jedoch fest, dass die Benutzeroberfläche bei der Verarbeitung einer größeren Nachricht blockiert und für einen Benutzer für 3 Minuten gesperrt werden kann.
Wir dachten also, dass das Hinzufügen von 'NOLOCK'-Hinweisen zu den Auswahlen hilfreich sein könnte. Es war nicht so. Nun, es hat vielleicht ein bisschen geholfen, aber die Abstürze passieren immer noch.
Ich dachte, dass die Ursache möglicherweise darin besteht, dass die Nachricht eintrifft und eine Transaktion gestartet wird, die andere Transaktionen daran hindert, zu funktionieren (sogar SELECT-Anweisungen, die ich nicht verstehe). Die Profilerstellung in der Datenbank zeigt, dass selbst einfache Auswahlen auf der Benutzeroberfläche einige Zeit in Anspruch nehmen (zSELECT fields FROM SingleTable WHERE PrimaryKey = Value
Unsere Indizes scheinen in Ordnung zu sein ... Wir haben Trigger für alle Tabellen, die einfach Aktualisierungen und Einfügungen in eine AUDIT-Datenbanktabelle kopieren. Glaube nicht, dass sie das Problem sind.
Ich denke, das liegt an der Transaktion rund um die Nachrichtenverarbeitung, die die Benutzeroberfläche sperrt.
Kann jemand vielleicht eine Erfahrung teilen oder mir sagen, wo ich nachsehen kann, warum wir UI-Sperren bekommen? Die Benutzeroberfläche sollte Priorität haben. Die Nachrichtenverarbeitung ist eine Hintergrundsache ... die Benutzer müssen Priorität haben ... aber es scheint, dass die Nachrichten die Datenbank sperren ... und wir sind uns nicht sicher, ob die Benutzeroberfläche jemals die Nachrichtenverarbeitung sperrt.
Hoffe jemand kann helfen. Ich kann so viele Informationen wie möglich zur Verfügung stellen, um zu helfen.