首页 新闻 会员 周边 捐助

java8 parallel() 并发处理sql报错后事务不回滚

0
悬赏园豆:20 [已解决问题] 解决于 2023-01-07 12:10

java8 parallel() 并发处理sql插入语句的时候报异常,主键重复插入;预期同一个事务下前面执行的插入应该回滚,实际情况是parallel方法里面的插入不会回滚,而外面的可以,不知道能否有解决办法,还是说java8这个并行流机制决定了不能做到事务回滚

老梁讲Java的主页 老梁讲Java | 初学一级 | 园豆:142
提问于:2019-05-30 11:00
< >
分享
最佳答案
0

在 Java 8 的并行流中使用事务时,您需要注意一些事项。并行流本质上是通过多线程执行流水线中的操作来实现的,这意味着在并行流内部可能会存在竞争条件。如果您在并行流内使用事务,则需要自己管理事务的并发访问。

在并行流中使用事务的一种方法是在流水线的操作中使用同步块来锁定事务。例如:

List<Tuple> tuples = // ...
Object transactionLock = new Object();
tuples.parallelStream().forEach(t -> {
  synchronized (transactionLock) {
    // begin transaction
    try {
      // execute transaction
    } catch (Exception e) {
      // rollback transaction
    } finally {
      // end transaction
    }
  }
});

这样,每个操作都会在同步块中执行,从而避免竞争条件。但是,这会降低并行性能。

另一种方法是使用数据库的分布式事务机制。不同的数据库产品提供了不同的分布式事务机制,您可以查看数据库文档以了解如何使用它们。

总之,在并行流内使用事务时,您需要注意并发访问的问题,并使用适当的机制来管理事务。

老梁讲Java | 初学一级 |园豆:142 | 2023-01-07 12:10
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册