Redis
 sql >> Datenbank >  >> NoSQL >> Redis

Verwenden von Async innerhalb einer Transaktion in der Spring-Anwendung

Die Antwort von M. Deinum ist gut, aber es gibt noch einen anderen Weg, der für Sie einfacher sein kann, je nach Stand Ihrer aktuellen Bewerbung.

Sie könnten den Aufruf der async-Methode einfach in ein Ereignis einschließen, das nach dem Commit Ihrer aktuellen Transaktion verarbeitet wird, damit Sie die aktualisierte Entität jedes Mal korrekt aus der Datenbank lesen.

Das geht ganz einfach, lass es mich dir zeigen:

import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.support.TransactionSynchronization;
import org.springframework.transaction.support.TransactionSynchronizationManager;

 @Transactional
public void doSomething() {

    // application code here

    // this code will still execute async - but only after the
    // outer transaction that surrounds this lambda is completed.
    executeAfterTransactionCommits(() -> theOtherServiceWithAsyncMethod.doIt());

    // more business logic here in the same transaction
}

private void executeAfterTransactionCommits(Runnable task) {
    TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
        public void afterCommit() {
            task.run();
        }
    });
}

Im Wesentlichen passiert hier, dass wir eine Implementierung für den aktuellen Transaktions-Callback bereitstellen und nur die afterCommit-Methode überschreiben – es gibt dort andere Methoden, die nützlich sein könnten, sehen Sie sich diese an. Und um zu vermeiden, dass Sie denselben Boilerplate-Code eingeben, wenn Sie ihn in anderen Teilen verwenden oder die Methode einfach lesbarer machen möchten, habe ich das in einer Hilfsmethode extrahiert.