最近做了一个批量插入报价的需求,然后在编辑报价时还能新增(新增多个就又是批量插入了),然后就把批量插入的地方提出来变成了一个方法,然后就看到网上说同类调用,@Transactional失效,吓得我连夜试了一下
结论如下:
1.saveOffer()加了@Transactional,insert()没加,事务可以回滚
2.saveOffer()没加@Transactional,insert()加了,事务无法回滚
3.1.saveOffer()和insert()都加了@Transactional,事务也可以回滚
a:saveOffer()方法
b:insert()方法
√:成功回滚
×:回滚失败
测出来的这个结论和网上一些说的不一样,我也不知道是版本变动,源代码修改了,还是我操作有误,和网上说的差异有点大
代码如下:
@Transactional
public void saveOffer(OfferSaveRequest request) {
//报价信息
OfferDO offerDO=new OfferDO();
offerDO.setId(IdWorker.getId());
offerDO.setExpressCompanyName("顺丰");
offerDO.setExpensesItemName("运输费");
offerDO.setUnit("单");
offerDO.setFees("10");
offerMapper.insert(offerDO);
//内部调用
this.insert(request);
// if (true) {
// throw new RuntimeException("测试异常");
// }
}
@Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRES_NEW)
public void insert(OfferSaveRequest request) {
//合同信息
ContractDO contractDO=new ContractDO();
contractDO.setId(IdWorker.getId());
contractDO.setContractName("测试合同");
contractMapper.insert(contractDO);
// int i=1/0;
}
网上说的@Transactional同类中调用失效,应该指的是a没加事务注解,而b加了事务注解,才失效的。
按我上面测试的,不管在a中报异常还是在b中报异常,回滚的时候两个表都会回滚,要不回滚就都不回滚。
当a没加事务注解,b加了事务注解的情况难道是指当b出了异常,b回滚,而不影响a的写入数据,这种业务我还没接触到。