Isolations- und Weitergabeparameter in @Transactional
In der @Transactional-Annotation von Spring definieren zwei kritische Parameter das Verhalten von Datenbanktransaktionen: Isolation und Weitergabe . In diesem Artikel wird erläutert, wann und warum Sie eine Anpassung der Standardwerte in Betracht ziehen sollten.
Propagation
Propagation definiert, wie Transaktionen miteinander in Beziehung stehen. Zu den allgemeinen 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 fehlerhafte Lesevorgänge zu verhindern, können Sie in diesem Szenario die Isolationsstufe auf READ_COMMITTED und die Weitergabestufe auf REQUIRED. Durch diese Kombination wird sichergestellt, dass Transaktionen nur Daten lesen, die von anderen Transaktionen festgeschrieben wurden.
Anpassen von Transaktionen
Im folgenden Beispiel die Methode provideService. Läuft immer innerhalb einer neuen Transaktion und stellt sicher, dass alle von anderen gleichzeitigen Aufgaben vorgenommenen Änderungen deren Ausführung nicht beeinträchtigen:
@Transactional(propagation=Propagation.REQUIRES_NEW)
public void provideService() {
repo1.retrieveFoo();
repo2.retrieveFoo();
}
Transaktionsverhalten testen
Um das Verhalten verschiedener Ausbreitungsebenen zu überprüfen, können Sie einen Java-Test verwenden:
@Test
public void testProvideService() {
TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition());
fooService.provideService();
transactionManager.rollback(status);
// Assert repository values are unchanged ...
}
Mit REQUIRES_NEW würde fooService.provideService() nicht zurückgesetzt, da es innerhalb einer separaten Transaktion ausgeführt wurde. Mit REQUIRED würde alles zurückgesetzt werden.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3