spring-事务案例

spring的案例场景
同一个事务中使用并发操作导致更新获取锁失败


@Autowired
Service service1;


@Transactional
public void methodA(){
	List<Object> objs;
	service1.deleteByid(id1);
	
	objs.parallelStream().forEach(o -> {
		UserEntity usEntity = new UserEntity();
		log.info("service1:{}", service1);
		service1.insert(usEntity);
	});
}

原因分析

1, service1.deleteByid()方法导致mysql线程创建事务,该事务获取到一个next key锁,有一段区间是(id1, \(\infty\)];
2, objs.parallelStream使用fork join pool 多线程进行任务分拆执行
3, 当objs的数量大于1时,parallelStream会使用当前线程,并另外创建一个线程执行任务
4, 另外创建的线程,因为不在当前线程中,所以属于新建的事务,新事务同时执行时就无法获取到锁

解决办法

1, objs.parallelStream() 换成 objs.stream()

posted @ 2024-03-11 16:01  原子切割员  阅读(21)  评论(0编辑  收藏  举报