sql >> Databáze >  >> NoSQL >> Redis

pomocí Async uvnitř transakce v aplikaci Spring

Odpověď od M. Deinum je dobrá, ale stále existuje jiný způsob, jak toho dosáhnout, který může být pro vás jednodušší, v závislosti na stavu vaší aktuální aplikace.

Volání asynchronní metody můžete jednoduše zabalit do události, která bude zpracována po potvrzení vaší aktuální transakce, takže aktualizovanou entitu z db pokaždé přečtete správně.

Je to docela jednoduché, dovolte mi, abych vám ukázal:

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

V zásadě se zde stane to, že dodáme implementaci pro aktuální zpětné volání transakce a přepíšeme pouze metodu afterCommit – existují další metody, které by mohly být užitečné, podívejte se na ně. A abyste se vyhnuli psaní stejného standardního kódu, pokud jej chcete použít v jiných částech nebo jednoduše učinit metodu čitelnější, extrahoval jsem to v pomocné metodě.



  1. 5 způsobů, jak získat minuty z rande v MongoDB

  2. Mongodb nastavuje jedinečné pole

  3. Vysoká dostupnost s Redis Sentinel:Připojení k Redis Master/Slave sadám

  4. $first v mongodb