spring事务是根据内部的ThreadLocal来启用的,一条线程代表一条单独的事务;在一个事务代码块内,启动多条线程,如果其中一条线程出错,其他线程并不会受影响,也不会触发spring的事务回滚。
- 示例代码:
@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
public void add() {
mapper.insert(new User(2L,"b"));
Thread thread = new Thread(() -> {
mapper.insert(new User(1L,"a"));
});
thread.start();
}
以上代码如果在thread里面出错,并不会影响mapper.insert(new User(2L,"b"));的事务,正常插入
但mapper.insert(new User(1L,"a"));也会插入,这可能在某些业务就不符合业务逻辑了(有时出错了就得部分回滚或全部回滚)
1.先介绍如何让线程内的业务代码回滚,主线程的业务不回滚的情况。
想让线程内的事务让spring管理,就得把里面的业务归回spring管理,看代码吧,说的奇奇怪怪的。
- 把要在手动创建的线程中执行的业务抽出来为一个单独