Isolations- und Ausbreitungsparameter in @Transactional
In der @Transactional-Annotation von Spring definieren zwei kritische Parameter das Verhalten von Datenbanktransaktionen: Isolation und Ausbreitung . In diesem Artikel wird erläutert, wann und warum Sie eine Anpassung der Standardwerte in Betracht ziehen sollten.
Weitergabe
Die Weitergabe definiert, wie Transaktionen zueinander in Beziehung stehen. Zu den gängigen Optionen gehören:
Standardwert: ERFORDERLICH
Isolation
Isolation definiert den Datenvertrag zwischen Transaktionen. Es verhindert bestimmte Dateninkonsistenzen, indem es den Grad der Sichtbarkeit von Datenänderungen angibt, die durch andere Transaktionen vorgenommen wurden. Die wichtigsten Isolationsstufen sind:
Standardwert:Variiert je nach Datenbank (z. B. REPEATABLE_READ für MariaDB)
Beispiel aus der Praxis
Bedenken Sie das Problem von Dirty Reads, bei denen eine Transaktion nicht festgeschriebene Änderungen lesen kann, die von einer anderen Transaktion vorgenommen wurden.
Thread 1 Thread 2 | | Write(x) | | | | Read(x) | | Rollback | | | Value (x) is now dirty (incorrect)
Um Dirty Reads zu verhindern, können Sie in diesem Szenario die Isolationsstufe auf READ_COMMITTED festlegen und die Ausbreitungsstufe auf ERFORDERLICH. Diese Kombination stellt sicher, dass Transaktionen nur Daten lesen, die von anderen Transaktionen festgeschrieben wurden.
Anpassen von Transaktionen
Im folgenden Beispiel die Methode provideService Wird immer innerhalb einer neuen Transaktion ausgeführt und stellt sicher, dass Änderungen, die durch andere gleichzeitige Aufgaben vorgenommen werden, deren Ausführung nicht beeinträchtigen:
<code class="java">@Transactional(propagation=Propagation.REQUIRES_NEW) public void provideService() { repo1.retrieveFoo(); repo2.retrieveFoo(); }</code>
Transaktionsverhalten testen
Um das zu überprüfen Verhalten verschiedener Ausbreitungsstufen können Sie einen Java-Test verwenden:
<code class="java">@Test public void testProvideService() { TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition()); fooService.provideService(); transactionManager.rollback(status); // Assert repository values are unchanged ... }</code>
Mit REQUIRES_NEW würde fooService.provideService() nicht zurückgesetzt werden, da es funktionierte innerhalb einer separaten Transaktion. Mit REQUIRED würde alles zurückgesetzt werden.
Das obige ist der detaillierte Inhalt vonWann und warum sollten Sie die Standard-Isolations- und Weitergabeparameter in @Transactional anpassen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!