Hohe Volumen Website mit ADO.NET Transaction vs ExecuteCommand auf NOLOCK, GELESEN direkt UNCOMMITTED?
-
06-07-2019 - |
Frage
Lesen Sie einfach diesen interessanten Artikel von Omar in seinem Blog Linq to SQL löst Transaktion Deadlock und Query Timeout Problem mit ungebundenem liest und am Ende Javed Hasan begann mit ihm über seine Lösung für die nolock Situation auf einer hohen Volumen Website zu streiten.
Hier ist das Problem zu lösen versuchen, aus dem SQL Sinne wir Select-Anweisungen mit NOLOCK oder Verwendung SET TRANSACTION LEVEL READ UNCOMMITTED, sonst bei hohen Lautstärke Reihen in DB verwenden müssen, werden Fehler gesperrt und führt. Die Technologie Omar verwendete Linq2Sql, so ist die Frage, wie bekommen wir diese in Ihrem C # Datenzugriffscode erreicht, so wird die oben nicht passieren?
Im Grunde genommen in der Post, kommt Omar zu seiner Lösung durch Arbeiten und Tests auf realer Welt Website und mit Werkzeugen wie SQLProfiler, während Javed Hasan mit MSDN Dokumenten zu seiner Lösung kommt und Scott Hanselman Blog-Post, etc.
Omar schlägt vor, mit dem folgenden
using (var db = new DropthingsDataContext2())
{
db.Connection.Open();
db.ExecuteCommand("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;");
var user = db.aspnet_Users.First();
var pages = user.Pages.ToList();
}
während Javed Hasan schlägt
using (new TransactionScope(TransactionScopeOption.Required,
new TransactionOptions { IsolationLevel = IsolationLevel.ReadUncommitted }))
{
//Your db Operation
}
Ich bin sehr daran interessiert zu wissen, was ihr da zu diesem speziellen Thema tun out auf einer hohen Volumen Website wie die StatckOverflow oder was haben Jeff und ihre Jungs in dieser Hinsicht tun?
Bearbeiten . Nach dem ersten Beitrag zu lesen, mag ich ein paar Dinge in Omars Post darauf hin,
- er hat in Verbindung Problem mit seinem Ansatz laufen, aber er löste es, seinen Posten sehen.
- was noch wichtiger ist er erwähnte er die Verwendung von ADO.NET Transaktion Art und Weise versucht, und versuchte sogar, was Scott Hanselman schrieb in seinem Blog, aber es ist nicht für hochvolumige Baustelle arbeiten, es verschlechtert sich die Leistung ziemlich viel. Omar sagte dieser „System.Transactions erheblichen Aufwand hat. Ich habe nie in der Lage gewesen, es auf einer hohen Volumen Website zu nutzen, ohne die CPU zu 100% und Req / s kommt bis zu 1 / 10tel gehen zu machen. Es ist für Enterprise-Anwendungen gemacht hat, nicht für Hoch Volumen-Websites. "
Lösung
Zu allererst bitte vermeiden uncommitted liest, kann sie viele Probleme verursachen. Ein viel besserer Ansatz ist nur auf die Datenbank eingestellt href="http://msdn.microsoft.com/en-us/library/tcbchxcb(VS.80).aspx" rel="noreferrer"> Snapshot-Isolation auf . Das ist, was Jeff tat .
Jeff sagte im Grunde: "bla bla bla, real, bla bla bla, Datenbank-Theoretiker, bla bla bla, kann READ UNCOMMITTED für REAL Produktion Anwendungen nützlich sein, die keine Datenkonsistenz brauchen." Jeff ist kein DBA, zum Glück gibt es viele DBAs sind hier heraus SO.
Das Problem mit Omars Ansatz ist, dass es Verbindungen mit „read uncommitted“ Isolationsstufe in Ihre Verbindung Pool austreten kann, die Verwüstung in Ihrer Website anrichten könnte. Bedeutung zufällige Erklärung kann in read uncommitted ausgeführt werden.
Javed Ansatz wäre viel besser, weil auf dispose MS die Möglichkeit hat, Sachen auf der Verbindung zu bereinigen.
Bearbeiten Wenn Sie mit Performance-Probleme mit Javeds Ansatz Sie rollen Sie Ihre eigenen Transaktionsmanager aussehen könnte.
Einige Dinge, die Sie wahrscheinlich tun wollen:
- Halten Sie einen Stapel von laufenden Transaktionen
- Bestätigen Sie auf dem Schöpfer Thread sind, wenn eine Transaktion festgeschrieben wird
- Zurücksetzen der Transaktion Isolation in den vorherigen Zustand auf dispose
- Zurücksetzen auf entsorgen, wenn die Transaktion nicht begangen hat.
- Unterstützung verschachtelte Rollbacks.
Andere Tipps
Ich bin ein Entwickler auf einem Tools-Team in der SQL Server-Gruppe bei Microsoft. Viele Anwendungen sind nicht superempfindlich Transaktionskonsistenz, vor allem, wenn Sie eine Anwendung schreiben, die oder etwas nicht berichten, wo gelegentlich inkonsistente Daten nicht das Ende der Welt ist. Natürlich, wenn Sie eine finanzielle Anwendung oder etwas anderes, das für Dateninkonsistenz hat eine sehr geringe Toleranz zu schreiben, möchten Sie wahrscheinlich andere Lösungen zu finden.
Wenn Sie wählen verwenden uncommitted liest, ich habe gebloggt eine praktische Lösung Erweiterungsmethoden in C # verwenden.
{Mein (schlecht) Ruf hindert mich, Kommentare zu veröffentlichen, so habe ich dies als eine Antwort}
Wenn Sie Isolation über System.Transactions verwenden und erstellen Sie einen neuen Linq Kontext innerhalb des Transaktionsblock, SQL Server endet versucht DTC zu rufen, die Transaktion zu koordinieren. Das geschah nur mir und war ganz unerwartet.
Für Transaktionen in .Net und (irgendwie überraschend) Nebeneffekt des DTC, dieses Dokument Einführung System.Transactions in .NET Framework 2.0 von Juval Löwy erklärt die Dinge sehr gut und ist immer noch voll gültig (.Net4). Lesenswert. (Ich würde auch einen Kommentar haben veröffentlichen ... wenn ich könnte.)