Вопрос по multithreading, java, spring – Как использовать весеннюю транзакцию в многопоточности

35

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

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 хорошо работать? Насколько я понимаю, methodB присоединит транзакцию метода A, что если methodA завершится раньше метода B? Я предполагаю, что только methodA может быть подтвержден транзакцией. Но methodB не будет фиксироваться, потому что транзакция зафиксирована ранее.

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

Может кто-нибудь помочь мне в этом вопросе? Заранее спасибо.

что именно вы хотите от этого? Michael Wiles

Ваш Ответ

1   ответ
26

methodB() не будет выполняться в той же транзакции, что иmethodA(), Пружина & APOS; s@Transactional работает только в одном потоке - он создает сеанс, когда поток впервые входит в метод с@Transactional (или метод в классе с@Transactional), а затем фиксирует его, когда покидает этот метод.

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

Error: User Rate Limit Exceededstatic.springsource.org/spring/docs/3.1.x/…
Error: User Rate Limit Exceeded Jacky
Error: User Rate Limit Exceeded Jacky
Error: User Rate Limit Exceeded Jacky
Error: User Rate Limit Exceeded

Похожие вопросы