Redis
 sql >> база данни >  >> NoSQL >> Redis

използване на Async в транзакция в приложението Spring

Отговорът от M. Deinum е добър, но има още един начин да постигнете това, който може да е по-прост за вашия случай, в зависимост от състоянието на текущото ви приложение.

Можете просто да обвиете извикването към метода async в събитие, което ще бъде обработено след извършване на текущата транзакция, така че всеки път да четете правилно актуализирания обект от db.

Това е доста лесно, позволете ми да ви покажа:

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

По същество това, което се случва тук, е, че ние предоставяме реализация за текущото обратно извикване на транзакция и само отменяме метода afterCommit - там има други методи, които може да са полезни, проверете ги. И за да избегнете въвеждането на същия стандартен код, ако искате да използвате това в други части или просто да направите метода по-четлив, извадих го в помощен метод.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Първи стъпки с клиентски API на Redis

  2. Грешка в командната команда на Redis Enterprise Clustering „CLUSTER“

  3. моите Redis ключове не изтичат

  4. Flask-SocketIO redis се абонирайте

  5. Разлика между StackExchange.Redis и ServiceStack.Redis