Spring @Transactional - Isolierung, Vermehrung
Kann mir jemand erklären, was isolation & Vermehrung Parameter sind für die in der @Transactional
Anmerkung über die Reale Welt Beispiel. Im Grunde, wenn und warum sollte ich wählen, um zu ändern Ihre Standard-Werte.
InformationsquelleAutor der Frage Mat B. | 2011-12-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gute Frage, wenn auch nicht trivial zu beantworten.
Vermehrung
Definiert, wie Transaktionen beziehen sich auf die jeweils anderen. Gemeinsame Optionen
Required
: Code wird immer in einer Transaktion ausgeführt werden. Erstellen Sie eine neue Transaktion oder wieder verwenden, wenn verfügbar.Requires_new
: Code läuft immer in einer neuen Transaktion. Auszusetzen aktuellen Transaktion, wenn eine vorhanden ist.Isolation
Definiert die Daten-Vertrag zwischen den Transaktionen.
Read Uncommitted
: Können dirty readsRead Committed
: Nicht erlaubt, dirty readsRepeatable Read
: Wenn eine Zeile gelesen wird zweimal in der gleichen transaciton, das Ergebnis wird immer das gleicheSerializable
: Führt alle Transaktionen in einer SequenzDen verschiedenen Ebenen haben verschiedene performance-Eigenschaften in einem multi-threaded-Anwendung. Ich denke, wenn Sie verstehen, die
dirty reads
Konzept werden Sie in der Lage, wählen Sie eine gute option.Beispiel, wenn ein dirty read auftreten können
So ein sane-Standard (wenn eine solche beansprucht werden kann) könnte
Read Comitted
das können Sie nur-lese-Werte, die bereits übergebene, die von anderen Transaktionen ausgeführt, in Kombination mit einem übertragungsgrad vonRequired
. Dann können Sie von dort aus arbeiten, wenn Sie die Anwendung hat andere Bedürfnisse.Einem praktischen Beispiel, wo eine neue Transaktion wird immer dann erstellt werden, wenn die Eingabe der
provideService
routine und abgeschlossen werden beim verlassen.Hatten wir verwendet
Required
anstatt die Transaktion offen bleibtwenn die Transaktion bereits geöffnet ist, wenn die Eingabe der routine.Beachten Sie auch, dass das Ergebnis einer
rollback
anders sein könnte, wie mehrere Hinrichtungen teilnehmen kann, in der gleichen Transaktion.Können wir leicht überprüfen Sie das Verhalten mit einem test und sehen Sie, wie sich die Ergebnisse unterscheiden mit Vermehrung Ebenen
Mit einem übertragungsgrad von
Requires new
würden wir erwarten, dassfooService.provideService()
war NICHT rollte zurück, da er Sie geschaffen, eigene sub-Transaktion.Required
wir würden erwarten, dass alles zurückgesetzt wurde und backing-store unverändert.InformationsquelleAutor der Antwort
PROPAGATION_REQUIRED = 0; Wenn DataSourceTransactionObject T1 ist bereits gestartet für die Methode M1.Wenn für eine andere Methode M2 Transaction-Objekt erforderlich ist ,wird keine neue Transaktion-Objekt wird erstellt .Dasselbe Objekt T1 verwendet wird, für M2
PROPAGATION_MANDATORY = 2; Methode muss die Ausführung innerhalb einer Transaktion. Wenn keine
vorhandenen Transaktion ausgeführt wird, wird eine Ausnahme geworfen werden
PROPAGATION_REQUIRES_NEW = 3; Wenn DataSourceTransactionObject T1 ist bereits gestartet für die Methode M1, und es ist in Bearbeitung(die ausführen-Methode M1) .Wenn eine andere Methode M2 starten, dann T1 ist suspendiert für die Dauer der Methode M2 mit neuen DataSourceTransactionObject T2 M2.M2 innerhalb seiner eigenen Transaktionskontext
PROPAGATION_NOT_SUPPORTED = 4; Wenn DataSourceTransactionObject T1 ist bereits gestartet für die Methode M1.Wenn eine andere Methode M2 ist gleichzeitig ausgeführt werden .Dann ist M2 nicht ausgeführt werden soll, innerhalb Transaktionskontext. T1 ist gehemmt bis M2 fertig ist.
PROPAGATION_NEVER = 5; Keine der Methoden führen Sie in der Transaktion Kontext.
Ein isolation level:
Es geht darum, wie viel eine Transaktion kann beeinträchtigt werden durch die Aktivitäten der anderen gleichzeitigen
Transaktionen.Es unterstützt die Konsistenz verlassen der Daten auf viele Tabellen in einem konsistenten Zustand.
Es beinhaltet das sperren von Zeilen und/oder Tabellen in einer Datenbank.
Das problem mit mehreren Transaktion
Szenario 1.Wenn Transaktion T1 liest Daten aus Tabelle A1, die geschrieben wurde, von einer anderen gleichzeitigen Transaktion T2.Wenn auf dem Weg T2 ist ein rollback werden die Daten,die durch
T1 ist ungültig.E.g a=2 ist die original-Daten .Wenn T1 read a=1 das war geschrieben von T2.Wenn T2-rollback ist dann a=1 ist, werden Rollbacks auf a=2 DB.Aber,Jetzt ,T1 a=1, aber in der DB
Tabelle geändert wird, um a=2.
Scenario2.Wenn Transaktion T1 liest Daten aus Tabelle A1.Wenn einer anderen gleichzeitigen Transaktion(T2) update-Daten Tabelle A1.Dann die Daten, die von T1 gelesen hat, ist
unterscheidet sich von Tabelle A1.Da T2 eine Fortschreibung der Daten in Tabelle A1.E.g wenn T1 read a=1 und T2 aktualisiert=2.Dann a!=b.
Szenario 3.Wenn Transaktion T1 liest Daten aus Tabelle A1, die mit bestimmten Anzahl von Zeilen. Wenn einer anderen gleichzeitigen Transaktion(T2) fügt weitere Zeilen in Tabelle A1.Die
Anzahl der gelesenen Zeilen von T1 unterscheidet sich von Zeilen in Tabelle A1
Szenario 1 bezeichnet wird Dirty reads.
Szenario 2 genannt wird Nicht-wiederholbare Lesevorgänge.
Szenario 3 genannt wird Phantom liest.
So, isolation level ist der Umfang, zu dem Szenario 1 Szenario 2 Szenario 3 verhindert werden kann.
Sie erhalten eine vollständige isolation Ebene durch die Implementierung von sperren.Das verhindert, dass gleichzeitige lese-und
schreibt auf die gleichen Daten auftreten.Aber es beeinflusst die Leistung .Die Ebene der isolation hängt von Anwendung zu Anwendung wie viel isolation ist
erforderlich.
ISOLATION_READ_UNCOMMITTED :Ermöglicht das Lesen von änderungen, die noch nicht begangen wurden.Sie leiden unter Szenario 1 Szenario 2 Szenario 3
ISOLATION_READ_COMMITTED:Erlaubt, liest von gleichzeitigen Transaktionen, die begangen worden sind. Sie leiden möglicherweise unter Szenario 2 und Szenario 3. Weil andere Transaktionen können die Aktualisierung der Daten.
ISOLATION_REPEATABLE_READ:mehrfacheinträge des gleichen Feldes erzielen Sie dasselbe Ergebnis, bis es geändert wird, von selbst.Sie leiden möglicherweise unter Szenario 3.Da
andere Transaktionen können das einfügen der Daten
ISOLATION_SERIALIZABLE: Szenario 1,Szenario 2,Szenario 3 noch nie passiert.Es ist komplett isoliert.Es umfasst vollständige Verriegelung.Es affets performace, weil
sperren.
Können Sie testen, mit
Können Sie Debuggen und schauen sich das Ergebnis mit verschiedenen Werten für die Isolierung und Vermehrung.
InformationsquelleAutor der Antwort abishkar bhattarai
Genug Erklärung zu jedem parameter angegeben wird, durch andere Antworten; Aber Sie bat um ein reales Beispiel, hier ist der eine, klärt die Einsatzmöglichkeiten von verschiedenen Vermehrung Optionen:
Angenommen, Sie sind verantwortlich für die Durchführung einer Anmeldung service, in denen eine Bestätigung per e-mail an den Benutzer gesendet wird. Sie kommen mit zwei service-Objekten, eines für die Einschreibung den Benutzer und eine für senden e-mails, die letztere ist aufgerufen, in die erste. Zum Beispiel so etwas wie dieses:
Haben Sie möglicherweise bemerkt, dass der zweite service ist der Vermehrung geben REQUIRES_NEW und darüber hinaus die Chancen sind, wirft er eine Ausnahme (SMTP-server down ,ungültige e-mail-oder anderen Gründen).Sie wollen wahrscheinlich nicht den gesamten Prozess zum roll-back, wie das entfernen der Benutzerinformationen aus einer Datenbank oder anderen Dingen; daher rufen Sie den zweiten Dienst in einer separaten Transaktion.
Zurück zu unserem Beispiel, dieses mal sind Sie besorgt über die Sicherheit der Datenbanken, so definieren Sie die DAO-Klassen in dieser Weise:
Bedeutung, dass, wenn ein DAO-Objekt, und somit einen potentiellen Zugriff auf db ist angelegt, die wir benötigen, um Ihnen zu versichern, dass der Anruf wurde von innen an einer unserer Dienstleistungen, was bedeutet, dass eine live-Transaktion sollte vorhanden sein; ansonsten tritt eine Ausnahme auf.Deshalb ist die Ausbreitung der Art ZWINGEND.
InformationsquelleAutor der Antwort ye9ane
Isolation level definiert, wie sich die änderungen auf einige Daten-repository durch eine Transaktion Auswirkungen auf andere gleichzeitige Transaktionen gleichzeitig, und auch, wie und Wann geändert, dass Daten verfügbar sind, um andere Transaktionen. Wenn wir definieren eine Transaktion mit dem Spring-framework sind wir auch in der Lage, zu konfigurieren, in dem isolation-level, die gleichen Transaktion ausgeführt werden.
READ_UNCOMMITTED isolation level besagt, dass eine Transaktion kann Daten Lesen, die noch kein commit von anderen Transaktionen ausgeführt.
READ_COMMITTED-Isolationsstufe besagt, dass eine Transaktion nicht Lesen können, Daten, die noch kein commit von anderen Transaktionen ausgeführt wurde.
Isolationsstufe REPEATABLE_READ besagt, dass wenn eine Transaktion liest einen Datensatz aus der Datenbank mehrere Male das Ergebnis all jener lese-Operationen immer der gleiche sein muss.
SERIALIZABLE isolation level ist der restriktivste aller Isolationsstufen. Transaktionen werden ausgeführt mit Verriegelung auf allen Ebenen (lese -, Auswahl-und write-sperren), so erscheinen Sie, als ob Sie hingerichtet wurden in einem serialisierten Weg.
Vermehrung ist die Fähigkeit, zu entscheiden, wie die business-Methoden gekapselt werden sowohl logische oder physische Transaktionen.
Frühjahr ERFORDERLICHE Verhalten bedeutet, dass die gleiche Transaktion wird verwendet, wenn es eine bereits geöffnete Transaktion in der aktuellen bean-Methode Ausführungskontext.
REQUIRES_NEW Verhalten bedeutet, dass eine neue physische Transaktion wird immer erstellt werden, indem die container.
Den VERSCHACHTELTEN Verhalten macht die verschachtelten Feder Transaktionen zu verwenden das gleiche physische Transaktion setzt aber savepoints zwischen den verschachtelten Aufrufe, also innere Vorgänge können auch rollback-unabhängig von äußeren Transaktionen.
Den OBLIGATORISCHEN Verhalten besagt, dass eine vorhandene geöffnet Transaktion müssen bereits vorhanden sein. Wenn nicht wird eine Ausnahme geworfen werden, die durch die container.
Den NIE Verhalten besagt, dass eine vorhandene geöffnet Transaktion muss nicht bereits existieren. Wenn eine Transaktion vorhanden ist, wird eine Ausnahme geworfen werden, die durch die container.
Den NOT_SUPPORTED Verhalten ausführen wird, die außerhalb des Gültigkeitsbereichs einer Transaktion. Wenn eine geöffnete Transaktion bereits existiert, wird es angehalten.
UNTERSTÜTZT die Verhalten ausgeführt wird im Rahmen einer Transaktion wenn eine Transaktion geöffnet ist bereits vorhanden. Wenn es nicht eine bereits geöffnete Transaktion die Methode wird ausgeführt, aber trotzdem in einem nicht-transaktionalen Weg.
InformationsquelleAutor der Antwort reos
Du fast nie nutzen wollen
Read Uncommited
da es nicht wirklichACID
konform.Read Commmited
ist ein guter Standard der Ausgangspunkt.Repeatable Read
wird wohl nur benötigt, reporting -, rollup-oder aggregation-Szenarien. Beachten Sie, dass viele DBs postgres enthalten eigentlich nicht unterstützen, Repeatable Read, müssen SieSerializable
statt.Serializable
ist nützlich für die Dinge, die Sie wissen müssen, geschehen völlig unabhängig von allem anderen; es ist wiesynchronized
in Java. Serializable geht hand in hand mitREQUIRES_NEW
Vermehrung.Benutze ich
REQUIRES
für alle Funktionen ausführen, UPDATE-oder DELETE-Abfragen sowie "service" level-Funktionen. Für DAO-level-Funktionen, die nur ausgeführt werden Selektiert, ich verwendeSUPPORTS
die Teilnahme an einem TX wenn man bereits begonnen hat (d.h. aus einem Webdienst aufgerufen wird function).InformationsquelleAutor der Antwort AngerClown
Transaction Isolation und Transaction Propagation zwar verwandt, aber doch deutlich zwei sehr unterschiedliche Konzepte. In beiden Fällen werden die Standardwerte angepasst an den client-boundary Komponente entweder mit Deklaratives Transaktions-management oder Programmgesteuerte Transaktionsverwaltung. Details der einzelnen isolation levels und Vermehrung-Attributen finden Sie im Referenz-links unten.
Transaction Isolation
Für zwei oder mehr Transaktionen/verbindungen zu einer Datenbank, wie und Wann werden die änderungen von Abfragen in einer Transaktion auswirken/sichtbar für die Abfragen in einer anderen Transaktion. Es auch damit zusammen, welche Art von Datenbank-record-locking wird verwendet werden, zu isolieren änderungen in dieser Transaktion von anderen Transaktionen und Umgekehrt. Dies ist in der Regel implementiert, die durch Datenbank/Ressource, ist die Teilnahme an der Transaktion.
.
Transaction Propagation
In einer enterprise-Anwendung für eine bestimmte Anforderung/Verarbeitung es gibt viele Komponenten, die involviert sind, um den job zu erledigen. Einige dieser Komponenten markieren die Grenzen (start, Ende) einer Transaktion verwendet wird, in der jeweiligen Komponente und sub-Komponenten. Für diese Transaktions-Grenze von Komponenten, die Transaktion Predigten gibt an, ob die jeweilige Komponente oder nimmt nicht an der Transaktion, und was passiert, wenn die aufrufende Komponente schon hat oder nicht haben bereits eine Transaktion erstellt/gestartet. Dies ist gleich als Java EE-Transaction-Attribute. Dies ist in der Regel umgesetzt, indem der client die Transaktion/Verbindung-manager.
Referenz:
Spring Transaction Management
Wiki Transaction Isolation (Datenbank-Systemen)
Oracle auf Transaktions-Isolationsstufen
Java EE-Transaction-Attribute (Fortpflanzung)
Spring Framework Transaction propagation
InformationsquelleAutor der Antwort Gladwin Burboz
Habe ich
outerMethod
,method_1
undmethod_2
mit unterschiedlichen Vermehrung-Modus.Unten ist die Ausgabe für verschiedene Vermehrung-Modus.
Äußeren Methode
Method_1
Method_2
-- Hier die Wichtigsten Äußeren vorhandene Transaktion, sowohl für die Methode 1 und 2
InformationsquelleAutor der Antwort NIrav Modi
Können wir hinzufügen:
InformationsquelleAutor der Antwort Ankit
Stellt eine Transaktion eine Einheit von Arbeit mit einer Datenbank.
Im Frühjahr
TransactionDefinition
- Schnittstelle, die definiert, Spring-konforme Transaktion Eigenschaften.@Transactional
annotation beschreibt, Transaktions-Attribute auf eine Methode oder Klasse.Sperren Wahrnehmung: isolation level bestimmt die Dauer, die sperren gehalten werden.
Lesen Wahrnehmung: die folgenden 3 Arten von wichtigen Problemen Auftritt:
UPDATES
von einem anderen tx.INSERTS
- und/oderDELETES
von einem anderen txIsolation levels mit verschiedenen Arten von liest:
für Beispiele
InformationsquelleAutor der Antwort Premraj
Können Sie verwenden, wie diese:
Können Sie dieses Ding auch:
InformationsquelleAutor der Antwort Ankit