How to use spring transaction in multithread

I have a method as below:

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

Can the methodB work well? Per my understanding, methodB will attach the transaction of methodA, what if methodA exits before methodB? I guess only methodA can be commited by the transaction. But methodB will not commit because the transaction commited before.

Can I use @Transactional(propagation = Propagation.REQUIRES_NEW) for methodB. This can let methodB have a new transaction. But according to spring doc, the transcation of methodA will suspend when it invoke methodB. I feel very confuse here.

Can anyone help me on this issue? Thanks in advance.

Answers


No, methodB() will not be executed in the same transaction as methodA(). Spring's @Transactional only works on a single thread - it creates a session when a thread first enteres a method with @Transactional (or a method in a class with @Transactional), and then commits it when it leaves that method.

In your example, the transaction will end after you schedule the job in the thread pool. methodB() will have it's own transaction.


Need Your Help

Best approach to Windows Forms rolling log output in TextBox

.net winforms logging textbox

In a Forms application I'm displaying log output from a long running command-line application that generated a lot of output. I start the program in the background, and capture its output and curre...

Ansible: 'groups' variable is undefined

ansible ansible-playbook

I'm getting a strange error when trying to apply a role: apparently 'groups' (the builtin variable) is undefined. I've tested on a play in the same playbook and the variable works. Any ideas?