„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Wann und warum sollten Sie die Standard-Isolations- und Weitergabeparameter in @Transactional anpassen?

Wann und warum sollten Sie die Standard-Isolations- und Weitergabeparameter in @Transactional anpassen?

Veröffentlicht am 06.11.2024
Durchsuche:637

When and Why Should You Adjust the Default Isolation and Propagation Parameters in @Transactional?

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:

  • REQUIRED: Führt den Code innerhalb einer vorhandenen Transaktion aus oder erstellt eine neue, falls keine vorhanden ist.
  • REQUIRES_NEW: Erstellt immer eine neue Transaktion und unterbricht alle vorhandenen.

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:

  • READ_UNCOMMITTED: Kein Schutz vor Dirty Reads.
  • SERIALIZABLE: Stärkste Isolation, um sicherzustellen, dass es keine Datenkonflikte gibt.

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.

Neuestes Tutorial Mehr>

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