Heim > Java > javaLernprogramm > 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?

DDD
Freigeben: 2024-11-03 19:56:02
Original
674 Leute haben es durchsucht

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

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:

  • ERFORDERLICH: Führt den Code innerhalb einer vorhandenen Transaktion aus oder erstellt eine neue, falls keine vorhanden ist.
  • ERFORDERLICH_NEU: 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)
Nach dem Login kopieren

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage