事务的传播机制
事务的传播行为就是在两个都启用了事务的方法进行嵌套调用时,外层事务和内层事务的执行动作,Spring支持七种传播方式,他们的效果如下:
- REQUIRED:如果有外层事务,则加入这个事务,否则开启一个新的事务
- SUPPORTS:如果有外层事务,则加入这个事务,否则就以非事务方式执行
- MANDATORY:如果有外层事务,则加入这个事务,否则抛出异常
- REQUIRES_NEW:开启一个独立的新事务执行
- NOT_SUPPORTED:方法不应该以事务方法执行,如果有外层事务,就以非事务方式执行
- NEVER:方法不应该以事务方法执行,如果有外层事务,就抛出异常
- NESTED:开启一个外层事务的子事务执行
这七种事务传播方式中,最经常使用的是REQUIRED,REQUIRES_NEW和NESTED这三种,本文详细介绍这三种事务传播方式的效果
REQUIRED
REQUIRED的效果为外部事务和内部事务同属于一个事务,任何一个回滚都会引起所有事务回滚
定义一个没有异常的新增操作和一个有异常的新增操作,分别加上事务,并指定事务传播行为为REQUIRED
@Service
public class InnerServiceImpl implements InnerService {
@Autowired
PersonMapper personMapper;
@Transactional(propagation = Propagation.REQUIRED)
@Override
public void insertPerson() {
personMapper.insert(new Person("小王", "HZ", 18));
}
@Transactional(propagation = Propagation.REQUIRED)
@Override
public void insertPersonWithException() {
personMapper.insert(new Person("小张", "BJ", 18));
throw new RuntimeException();
}
}
情景1
@Service
public class OuterServiceImpl implements OuterService {
@Autowired
PersonMapper personMapper;
@Autowired
InnerService innerService;
@Transactional
@Override
public void insertPersons() {
personMapper.insert(new Person("小陈", "SZ", 18));
innerService.insertPerson();
innerService.insertPersonWithException();
}
}
三条数据都回滚,因为外层事务和内层事务属于同一个事务,insertPersonWithException方法发生了异常,使得整个事务回滚,无论是在内层事务的新增操作还是外层事务的新增操作都未被新增
情景2
@Service
public class OuterServiceImpl implements OuterService {
@Autowired
PersonMapper personMapper