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

版权声明:本文为博主原创文章,未经允许不得转载。 https://blog.csdn.net/qq_31142553/article/details/86363468

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

// 批量取消
@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,再试了一下,哇,居然解决了!?

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

猜你喜欢

转载自blog.csdn.net/qq_31142553/article/details/86363468