版权声明:本文为博主原创文章,未经允许不得转载。 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,再试了一下,哇,居然解决了!?
不知道我说的那个原因是否正确,反正先记录下来。大家觉得是什么原因呢?我想要并行又怎么处理呢?欢迎发表留言进行讨论。