2009-07-07 11 views

Antwort

3

Aktualisieren, um die verschiedenen Isolationsstufen einer Transaktion erklären kann: Geklärte und korrigiert Erklärung.

Isolationsstufen geben nur an, wie viel von Ihrer Transaktion von anderen gleichzeitigen Transaktionen betroffen ist. Je höher die Isolationsstufe, desto weniger betroffen ist sie.

Der Aufwand wird in CPU-Auslastung, Arbeitsspeicherlast und vielleicht Commit Latenz manifestiert. Außerdem können Schreibkonflikte in höheren Isolationsstufen wahrscheinlicher sein, was dazu führen kann, dass Sie Ihre Transaktion abbrechen und das Ganze erneut versuchen müssen. (Dies betrifft nur Transaktionen, die Aktualisierungen oder Einfügungen durchführen, nicht Transaktionen, die nur Auswahlen ausführen.)

Im Allgemeinen gilt als Faustregel, dass die niedrigste Stufe verwendet wird, die Ihrer Anwendung die Konsistenz gibt, die sie benötigt.

Die vom Read Committed-Modus bereitgestellte partielle Transaktionsisolation ist für viele Anwendungen ausreichend und dieser Modus ist schnell und einfach zu verwenden; es ist jedoch nicht für alle Fälle ausreichend. Anwendungen, die komplexe Abfragen und Aktualisierungen durchführen, erfordern möglicherweise eine strengere konsistente Ansicht der Datenbank, als der Read Committed-Modus bietet.

Der serialisierbare Modus bietet eine strenge Garantie, dass jede Transaktion eine vollständig konsistente Ansicht der Datenbank sieht. Die Anwendung muss jedoch darauf vorbereitet sein, Transaktionen erneut zu versuchen, wenn gleichzeitige Aktualisierungen es unmöglich machen, die Illusion einer seriellen Ausführung aufrecht zu erhalten. Da die Kosten für das Wiederholen komplexer Transaktionen erheblich sein können, wird der serialisierbare Modus nur dann empfohlen, wenn das Aktualisieren von Transaktionen eine ausreichend komplexe Logik enthält, die im Read Committed-Modus möglicherweise falsche Antworten liefert. In den meisten Fällen ist der Modus Serializable erforderlich, wenn eine Transaktion mehrere aufeinanderfolgende Befehle ausführt, die identische Ansichten der Datenbank anzeigen müssen.

(http://www.postgresql.org/docs/8.4/interactive/transaction-iso.html ist sehr schön.)

+2

Sorry, aber 1. Para ist falsch. Die Isolationsstufe steuert, was die aktuelle Transaktion von anderen Transaktionen sehen wird, und auch wie viele Sperren die aktuelle Transaktion erzeugt. Es beeinflusst nicht, was eine andere Transaktion sieht - es ist die Isolationsstufe dieser anderen Transaktion, die steuert, was sie sieht. –

+0

Es ist wahrscheinlich korrekter, dass die Vereinigung Ihrer Isolationsstufe mit anderen Isolationsstufen dies entscheidet. – Christopher

+0

Dies ist ein alter Beitrag, aber ich habe eine verwandte Teilfrage ... http://stackoverflow.com/questions/9519610/transaction-isolation-level-massive-number-of-writes – Darwly

1

Wenn Sie über die Unterschiede in Isolationsstufen auf die Standardeinstellung nicht sicher sind, dann bleiben. Das Ändern des Levels kann besondere Nebenwirkungen haben. 99% der Anwendungen sind mit der Standardeinstellung in Ordnung.

Der Standard, denke ich, variiert mit jedem JDBC-Treiber, obwohl einige Frameworks wie JPA es erzwingen können, kann ich nicht ohne weiteres erinnern. Der häufigste Standardwert ist read_committed, da er die beste allgemeine Ausgewogenheit zwischen Transaktionssicherheit und Nebenläufigkeit bietet. Wenn Sie eine andere Isolationsstufe wählen, opfern Sie Sicherheit oder Gleichzeitigkeit, und Sie müssen sich des Kompromisses bewusst sein.

+0

Ich finde die Erklärung im Wiki wenig gegeben entmutigend und schwer zu verstehen. Könnten Sie das bitte vereinfachen? Vielen Dank. – peakit

+2

Der Standardwert hängt von den Einstellungen des Datenbankservers und nicht vom JDBC-Treiber ab. – talonx

0

Was zum Teufel ist die Frage ?!

Isolationsstufen definieren den Sperrtyp und die Sperrgranularität, die vom DBMS verwendet werden. Das Sperren ist im Kontext von DBMSs wichtig, da Transaktionen gleichzeitig von potenziell vielen Benutzern ausgeführt werden. Höhere Transaktionsisolation - wie SERIALIZABLE - ist sicherer - Sie können potenziell fehlerhafte Lesevorgänge und Phantomupdates eliminieren -, aber eine Strafe auferlegen, da serialisierte Transaktionen die Parallelität einschränken und daher die Skalierbarkeit ausschließen.

Was ist zu tun?Gestalten Sie die Anwendung so, dass die Logik die Möglichkeit "schlechter Daten" einschränkt, indem serialisierte Transaktionen sinnvollerweise verwendet werden, aber nicht so, dass die Nebenläufigkeit unnötig behindert wird.