将事务传播到Forkjoin提交

时间:2019-05-25 21:01:12

标签: java spring-boot transactions spring-transactions forkjoinpool

我正在创建一个带有多个线程的ForkJoinPool来执行并行流,该线程是从jpa中的查询执行的,但是我无法将Transactional传播传播到ForkJoinPool的方法提交。

@Transactional(readOnly = true)
public void streamTest() {
    ForkJoinPool customThreadPool = new ForkJoinPool(20);
    try {
    customThreadPool.submit(() ->
         priceRepository.streamAll()
         .parallel()
         .map(p -> this.transform(p))
         .forEach(System.out::println)
         ).get();
    } catch (InterruptedException | ExecutionException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

我收到错误消息:“您正在尝试在没有周围事务的情况下执行流查询方法,该事务使连接保持打开状态,以便实际上可以使用Stream。请确保使用该流的代码使用@Transactional或任何其他声明(只读)事务的方式。”

如果我脱下ForkJoinPool来执行流,则可以正常工作。 如何将事务(readOnly)传播到从ForkJoinPool提交的方法的执行中,有办法吗?

1 个答案:

答案 0 :(得分:0)

我发现了如何在ForkJoinPool任务中设置事务性。 我只需要像下面那样使用TransactionSynchronizationManager。

@Transactional(readOnly = true)
public void streamTest() {
ForkJoinPool customThreadPool = new ForkJoinPool(20);
try {
customThreadPool.submit(() -> {
    TransactionSynchronizationManager.setActualTransactionActive(true);
    TransactionSynchronizationManager.setCurrentTransactionReadOnly(true);
    TransactionSynchronizationManager.initSynchronization();
     priceRepository.streamAll()
     .parallel()
     .map(p -> this.transform(p))
     .forEach(System.out::println);
     }).get();
} catch (InterruptedException | ExecutionException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

}