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.
Your parent processing thread will (1.) create new threads to do parallel DB inserts, (2.) create a CountDownLatch object (this will hold your parent thread until all child threads which are doing db inserts are finished) (3.) create a db connection object with auto commit mode as FALSE.
Spring uses the underlying database implementation for transactions, so they are as thread safe as the underlying database can be.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With