1.why
如果不使用主动给定回滚机制的话,回滚机制只能针对一次会话,前后的会话不能作为一个整体来看待。当前面的删除执行之后、新增或者修改异常。那么数据也不会回到以前的状态,而是只是删除后的样子
2.有两种解决方式
方式一
直接在方法上加上@Transactional
@Transactional(rollbackFor = Exception.class)
public Boolean addbyList() {
relatedScrapMapper.delete();
relatedScrapMapper.add(list);
return true;
}
方式二
如果需要使用try-catch对异常进行捕获,就会使事务控制失效,因为该类的异常并没有抛出,就不是触发事务管理机制。那么使用@Transactional将会失效
QS虽然手动回滚了,但是仍然不能删除@Transactional,删除后仍然会失效
@Transactional(rollbackFor = {Exception.class})
public Boolean addbyList() {
try {
relatedScrapMapper.delete();
relatedScrapMapper.add(par);
return true;
}catch(Exception e) {
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();//手动回滚
return false;
}
}
QS:错误的想法----既然是被捕获了之后,使事务控制失效,那就给它抛出去给它捕获
这样并不能让事务回滚
@Transactional(rollbackFor = Exception.class)
public Boolean addbyList() throws Excpetion{
try {
relatedScrapMapper.delete();
relatedScrapMapper.add(par);
return true;
}catch(Exception e) {
throw new Excpetion();
//return false;
}
}