sql >> Databasteknik >  >> NoSQL >> Redis

använder Async i en transaktion i Spring-applikationen

Svaret från M. Deinum är bra men det finns fortfarande ett annat sätt att uppnå detta som kan vara enklare för ditt fall, beroende på statusen för din nuvarande ansökan.

Du kan helt enkelt slå in anropet till asynkroniseringsmetoden i en händelse som kommer att bearbetas efter att din nuvarande transaktion har genomförts så att du kommer att läsa den uppdaterade enheten från db korrekt varje gång.

Det är ganska enkelt att göra detta, låt mig visa dig:

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();
        }
    });
}

Vad som i princip händer här är att vi tillhandahåller en implementering för den aktuella transaktionsåteruppringningen och vi åsidosätter bara afterCommit-metoden - det finns andra metoder där som kan vara användbara, kolla in dem. Och för att undvika att skriva in samma typkod om du vill använda denna i andra delar eller helt enkelt göra metoden mer läsbar extraherade jag det i en hjälpmetod.



  1. Hur designar man redis pub/sub för ett snabbmeddelandesystem?

  2. Hur man installerar Apache CouchDB 2.3.0 i Linux

  3. Kan inte skapa index i mongodb, nyckeln är för stor för att indexera

  4. Kan inte ansluta till MongoDB via node.js i Docker