Подтвердить что ты не робот

Как использовать транзакцию spring в многопоточном режиме

У меня есть метод, как показано ниже:

ClassA.java
@Transactional
public void methodA(){        
    ExecutorService executorService = Executors.newFixedThreadPool(4);
    executorService.execute(new Runnable() {
        public void run() {
            classB.methodB();
        }
});
}
ClassB.java
@Transactional
public void methodB(){
    updateDB();
}

Может ли метод B работать хорошо? По моему пониманию, метод B присоединяет транзакцию метода А, что, если метод А выходит до метода Б? Я предполагаю, что транзакция может быть совершена только методом А. Но методB не будет зафиксирован, потому что транзакция была совершена раньше.

Могу ли я использовать @Transactional (распространение = Propagation.REQUIRES_NEW) для методаB. Это может позволить methodB иметь новую транзакцию. Но согласно spring doc, передача метода A приостанавливается при вызове метода B. Я чувствую себя очень запутанным здесь.

Может ли кто-нибудь помочь мне по этой проблеме? Спасибо заранее.

4b9b3361

Ответ 1

Нет, methodB() не будет выполняться в той же транзакции, что и methodA(). Spring @Transactional работает только в одном потоке - он создает сеанс, когда поток сначала вводит метод с @Transactional (или метод в классе с @Transactional), а затем совершает его, когда он покидает этот метод.

В вашем примере транзакция завершится после того, как вы запланируете задание в пуле потоков. methodB() будет иметь свою собственную транзакцию.