只观察 Propagation.REQUIRED 和 Propagation.REQUIRES_NEW 的表现:
示例代码:
@Service class DbServiceIn { @Autowired PersonMapper personMapper; @Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class) public void addPersonIn() throws Exception { Person p = new Person(); p.setName("张婉悠"); p.setAge(25); personMapper.insertSelective(p); // if (true) { // throw new Exception(); // } } } @Service public class DbService { @Autowired DbServiceIn dbServiceIn; @Autowired PersonMapper personMapper; @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) public void addPerson() throws Exception { Person p = new Person(); p.setName("尹腾腾"); p.setAge(28); personMapper.insertSelective(p); try { dbServiceIn.addPersonIn(); } catch (Exception e) { e.printStackTrace(); } System.out.println("外部方法"); } }
2 个 service 的方法都是 REQUIRED,当 addPersonIn 方法执行完后,事务并不会提交,但是 addPersonIn 方法抛出异常,addPerson 方法也会回滚,即便 addPerson 方法已经捕获了异常。addPerson 和 appPersonIn 必须是在 2 个不同的类中。
DbServiceIn 的方法是 REQUIRES_NEW,当 addPersonIn 方法执行完后,事务会提交,addPersonIn 方法抛出异常,addPerson 方法不会回滚。
浙公网安备 33010602011771号