使用Java8并行流出现的数据库事务问题

今天,在做一个功能的时候,写到了大概类似下面这种代码

// 批量取消
@Transactional
public void batchCancel(Long studyId) {
    // 1、根据学习id查询到所有的预约id
    List<Long> bookIds = ...;
    // 2、遍历预约id集合,逐一进行取消操作
    bookIds.parallelStream()
        .forEach(bookId -> {
            // 3、根据预约id取消
            cancel(bookId);
        });
}

// 根据id取消预约
private void cancel(Long bookId) {
    // 1、根据id将指定预约的状态修改为取消
    updateXxx...// 此处执行数据库update操作
}

结果,一执行就出现了以下的错误 

Caused by: javax.persistence.TransactionRequiredException: Executing an update/delete query

很明显,这是缺少事务的异常。但是仔细一看,我在最外层的公开方法上分明写了@Transactional注解,怎么会出现这个异常呢?

研究了半天也没能解决,最后认真看了里面的代码,原来是为了让批量取消预约能够并行处理,就在创建Stream流的时候使用了parallelStream

然后就想,是不是在不同线程里Spring事务的嵌套就没有效果了?抱着这个态度,把parallelStream改成了stream,再试了一下,哇,居然解决了!?

不知道我说的那个原因是否正确,反正先记录下来。大家觉得是什么原因呢?我想要并行又怎么处理呢?欢迎发表留言进行讨论。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Java分布式数据库是一种能够实现数据存储和访问在多个节点上的数据库系统。它可以在多个服务器上进行水平扩展,提供更好的性能和可扩展性。 Java分布式数据库具有以下特点: 1. 数据分布:Java分布式数据库将数据分布在多个节点上,每个节点负责一部分数据存储和查询操作。这样可以提高数据的并行处理能力,提高系统整体的吞吐量。 2. 数据复制:Java分布式数据库可以将数据复制到多个节点上,提供数据冗余和容灾功能。即使一个节点发生故障,系统仍然能够正常工作,提高了系统的可用性。 3. 数据一致性:Java分布式数据库通过使用分布式事务和一致性协议来保证数据的一致性。当数据发生更新时,分布式数据库会自动同步数据到其他节点,确保数据的一致性。 4. 分布式查询:Java分布式数据库可以将查询操作分发到多个节点上并行执行,提高查询的性能。同时,它还能够自动合并和返回查询结果,使得对用户来说具有透明性。 5. 负载均衡:Java分布式数据库可以根据节点的负载情况自动进行负载均衡,确保每个节点的负载均衡,提高系统的整体性能。 总的来说,Java分布式数据库通过数据分布、数据复制、数据一致性、分布式查询和负载均衡等功能,实现了数据在多个节点间的高效和可靠存储和访问。这对于大规模数据存储和高并发访问的应用场景非常有用。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值