Для этого вам нужно использовать на первом handle()
что-то вроде этого:
.handle(ServicetoDBAdaptor,"storeToTable1", e -> e.transactional(true))
Этот хук будет делать именно это:
/**
* Specify a {@link TransactionInterceptor} {@link Advice} with default
* {@code PlatformTransactionManager} and {@link DefaultTransactionAttribute} for the
* {@link MessageHandler}.
* @param handleMessageAdvice the flag to indicate the target {@link Advice} type:
* {@code false} - regular {@link TransactionInterceptor}; {@code true} -
* {@link org.springframework.integration.transaction.TransactionHandleMessageAdvice}
* extension.
* @return the spec.
*/
public S transactional(boolean handleMessageAdvice) {
Где мы собираемся использовать это:
/**
* A {@link TransactionInterceptor} extension with {@link HandleMessageAdvice} marker.
* <p>
* When this {@link Advice} is used from the {@code request-handler-advice-chain}, it is applied
* to the {@link MessageHandler#handleMessage}
* (not to the
* {@link org.springframework.integration.handler.AbstractReplyProducingMessageHandler.RequestHandler#handleRequestMessage}),
* therefore the entire downstream process is wrapped to the transaction.
* <p>
* In any other cases it is operated as a regular {@link TransactionInterceptor}.
*
* @author Artem Bilan
*
* @since 5.0
*/
@SuppressWarnings("serial")
public class TransactionHandleMessageAdvice extends TransactionInterceptor implements HandleMessageAdvice {
Ключевой трюк здесь the entire downstream process is wrapped to the transaction.
.
Поэтому транзакция начнется с вашего storeToTable1()
и будет расширена до конца потока, и ваш storeToTable2()
будет участвовать в той же передаче. Таким образом, когда этот откатывается, первый тоже будет откатываться. Только потому, что у вас будет только одна транзакция!