只观察 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 方法不会回滚。

posted on 2018-05-25 11:35  偶尔发呆  阅读(118)  评论(0)    收藏  举报