为了账号安全,请及时绑定邮箱和手机立即绑定

将事务传播到 Forkjoin 提交

将事务传播到 Forkjoin 提交

四季花海 2022-12-15 17:05:39
我正在创建一个具有多个线程的 ForkJoinPool 来并行执行一个流,它是从 jpa 中的查询执行的,但是我在将事务传播到 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();    }}我收到错误消息:“您正在尝试在没有保持连接打开的周围事务的情况下执行流式查询方法,以便实际上可以使用流。确保使用流的代码使用@Transactional 或任何其他方式声明一个(只读)事务。”如果我取消 ForkJoinPool 来执行流,它工作正常。如何将事务(只读)传播到从 ForkJoinPool 提交的方法的执行,有没有办法?
查看完整描述

1 回答

?
跃然一笑

TA贡献1826条经验 获得超6个赞

我发现了如何在 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();

}

}


查看完整回答
反对 回复 2022-12-15
  • 1 回答
  • 0 关注
  • 99 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信