sql >> Base de Datos >  >> NoSQL >> Redis

usando Async dentro de una transacción en la aplicación Spring

La respuesta de M. Deinum es buena, pero todavía hay otra forma de lograrlo que puede ser más simple para su caso, según el estado de su aplicación actual.

Simplemente puede envolver la llamada al método asíncrono en un evento que se procesará después de que se confirme su transacción actual para que lea la entidad actualizada de la base de datos correctamente cada vez.

Es bastante simple hacer esto, déjame mostrarte:

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

Básicamente, lo que sucede aquí es que proporcionamos una implementación para la devolución de llamada de la transacción actual y solo anulamos el método afterCommit; hay otros métodos que pueden ser útiles, consúltelos. Y para evitar escribir el mismo código repetitivo si desea usar esto en otras partes o simplemente hacer que el método sea más legible, lo extraje en un método auxiliar.