问题: 当我们使用stream().parallel()并行操作时,由于spring事务的单线程特性,无法有效在主线程执行预期的事务操作。
解决:
一、如同大多数多线程事务的处理方式,我们将事务细分化,对单个线程进行事务操作即可。
比如下伪代码,方法二中在每个线程中使用事务。由于单个线程中的类是注入到spring中的,所以可以分别其执行事务。
@Service
public class TestServiceA {
@Autowired
private TestServiceB serviceB;
/**
* 无效的事务
*
*/
@Transactional(rollbackFor = Exception.class)
public void testparallelStreamTransactin0(List<String> list) {
list.stream().parallel().forEach(e -> {
// do insert 1
// do insert 2
});
}
/**
* 有效的事务
*/
@Transactional(rollbackFor = Exception.class)
public void testparallelStreamTransactin1(List<String> list) {
list.stream().parallel().forEach(data -> {
serviceB.insert(data);
});
}
}
@Service
public class TestServiceB {
@Transactional