sql - Was ist die beste Standard-Transaktionsisolationsstufe für ein ERP, falls vorhanden?

Translate

Kurzer Hintergrund: Wir beginnen gerade mit der Migration / Neuimplementierung eines ERP-Systems nach Java mit Hibernate und zielen auf eine gleichzeitige Benutzeranzahl von 50 bis 100 Benutzern ab, die das System verwenden. Wir verwenden MS SQL Server als Datenbankserver, was für diese Ladevorgänge ausreichend ist.

Jetzt verwendet das alte System überhaupt keine Transaktionen mehr und verlässt sich bei kritischen Teilen (z. B. Bestandsänderungen) darauf, manuelle Sperren (mithilfe von Flags) festzulegen und diese freizugeben. Das ist so etwas wie manuelles Transaktionsmanagement. Manchmal gibt es jedoch Probleme mit Dateninkonsistenzen. Im neuen System möchten wir Transaktionen verwenden, um diese Probleme zu beseitigen.

Nun die Frage: Was wäre gut / vernünftigStandardTransaktionsisolationsstufe für ein ERP-System bei einer Nutzung von ca. 85% OLTP und 15% OLAP? Oder sollte ich immer pro Aufgabe entscheiden, welche Transaktionsebene verwendet werden soll?

Und zur Erinnerung die vier Transaktionsisolationsstufen: LESEN SIE UNVERBINDLICH, LESEN SIE VERPFLICHTET, WIEDERHOLBAR LESEN, SERIALISIERBAR

This question and all comments follow the "Attribution Required."

Alle Antworten

Translate

99 mal von 100 ist "gelesen" die richtige Antwort. Dadurch wird sichergestellt, dass Sie nur Änderungen sehen, die von der anderen Sitzung festgeschrieben wurden (und somit konsistente Ergebnisse, vorausgesetzt, Sie haben Ihre Transaktionen korrekt entworfen). Es verursacht jedoch nicht den Sperraufwand (insbesondere in Nicht-Oracle-Datenbanken), den wiederholbares Lesen oder serialisierbares Auferlegen verursacht.

Gelegentlich möchten Sie möglicherweise einen Bericht erstellen, in dem Sie bereit sind, die Genauigkeit für die Geschwindigkeit zu opfern und eine nicht festgeschriebene Isolationsstufe für das Lesen festzulegen. Das ist selten eine gute Idee, aber es ist gelegentlich eine einigermaßen akzeptable Problemumgehung, um Konfliktprobleme zu lösen.

Serialisierbares und wiederholbares Lesen wird gelegentlich verwendet, wenn Sie einen Prozess haben, der über den gesamten Lauf hinweg einen konsistenten Datensatz anzeigen muss, unabhängig davon, was andere Transaktionen gerade tun. Es kann angebracht sein, einen Abstimmungsprozess zum Monatsende auf serialisierbar zu setzen, z. B. wenn viel prozeduraler Code vorhanden ist, die Möglichkeit besteht, dass Benutzer Änderungen vornehmen, während der Prozess ausgeführt wird, und eine Anforderung, die der Prozess erfüllen muss Stellen Sie sicher, dass die Daten immer so angezeigt werden, wie sie zum Zeitpunkt des Abgleichs vorhanden waren.

Quelle
Translate

Vergessen Sie nicht SNAPSHOT, das sich direkt unter SERIALIZABLE befindet.

Dies hängt davon ab, wie wichtig es ist, dass die Daten in den Berichten korrekt sind. Es ist wirklich eine Aufgabe für Aufgabe.

Quelle
Translate

Es hängt wirklich sehr davon ab, wie Sie Ihre Anwendung entwerfen. Die einfache Antwort wird einfach unter READ_COMMITTED ausgeführt.

Sie können argumentieren, dass Sie, wenn Sie Ihr System unter Berücksichtigung dessen entwerfen, READ_UNCOMMITTED als Standard verwenden und die Isolationsstufe nur dann erhöhen können, wenn Sie sie benötigen. Die überwiegende Mehrheit Ihrer Transaktionen wird ohnehin erfolgreich sein, sodass das Lesen nicht festgeschriebener Daten keine große Sache sein wird.

Wie sich Isolationsstufen auf Ihre Abfragen auswirken, hängt von Ihrer Zieldatenbank ab. Beispielsweise müssen Datenbanken wie Sybase und MSSQL beim Ausführen von READ_COMMITTED mehr Ressourcen sperren als Datenbanken wie Oracle.

Quelle
Translate

Für SQL Server (und wahrscheinlich die meisten wichtigen RDBMS) würde ich mich an die Standardeinstellung halten. Für SQL Server ist dies READ COMMITTED. Alles andere und Sie überfordern die Datenbank, alles andere und Sie haben Konsistenzprobleme.

Quelle
Translate

Uncommitted lesen ist definitiv der Außenseiter in den meisten Foren. Es gibt jedoch Gründe für die Verwendung, die über die häufig erwähnte Frage "Geschwindigkeit versus Genauigkeit" hinausgehen.

Angenommen, Sie haben:

  • Transaktion T1: Schreibt B, liest A (etwas mehr Arbeit), Commit.
  • Transaktion T2: Schreibt A, liest B (etwas mehr Arbeit), Commit.

Bei gelesenem Commit werden die oben genannten Transaktionen erst nach dem Commit freigegeben. Dann können Sie in eine Situation geraten, in der T1 darauf wartet, dass T2 A freigibt, und T2 darauf wartet, dass T1 B freigibt. Hier kollidieren die beiden Transaktionen in einer Sperre.

Sie können diese Prozeduren neu schreiben, um dieses Szenario zu vermeiden (Beispiel: Ressourcen immer in alphabetischer Reihenfolge erwerben!). Bei zu vielen gleichzeitigen Benutzern und Zehntausenden von Codezeilen kann dieses Problem jedoch sowohl sehr wahrscheinlich als auch sehr schwer zu diagnostizieren und zu lösen sein.

Die Alternative ist Read Uncommitted. Anschließend entwerfen Sie Ihre Transaktionen unter der Annahme, dass möglicherweise fehlerhafte Lesevorgänge vorliegen. Ich persönlich finde dieses Problem viel lokaler und behandelbarer als die ineinandergreifenden Zugwracks.

Die Probleme durch Dirty Reads können von verhindert werden

  • (1) Rollbacks: nicht. Dies sollte die letzte Verteidigungslinie sein, nur bei Hardwarefehlern, Netzwerkfehlern oder Programmabstürzen.

  • (2) Verwenden Sie Anwendungssperren, um einen Sperrmechanismus zu erstellen, der auf einer höheren Abstraktionsebene arbeitet, wobei jede Sperre näher an einer realen Ressource oder Aktion liegt.

Quelle
Leave a Reply
You must be logged in to post a answer.
Über den Autor