SpringBoot事务回滚

1、Controller代码

   @PostMapping("/add")
   public RestResult add(ModelParamInputDTO modelParamDTO) {
       this.isValid("modelName", modelParamDTO.getModelName());
       this.isValid("drugId", modelParamDTO.getDrugId());
       this.isValid("drugCode", modelParamDTO.getDrugCode());
       aiModelService.addAiModel(modelParamDTO);
       return ResultGenerator.genSuccessResult().setMessage("保存成功");
   }
   
   @PostMapping("/isValid")
   public RestResult isValid(@RequestParam String key, String value) {
       Boolean isValid = aiModelService.isValid(key, value);
       if (isValid) {
           return ResultGenerator.genSuccessResult();
       } else {
           String[] ret = {""};
           VALID_MESSAGE.forEach((k, v) -> {
               if (k.equals(key)) {
                   ret[0] = v;
               }
           });
           throw new ServiceException(ret[0]);
       }
   }

2、service代码

@Override
@Transactional(rollbackFor=Exception.class)
public void addAiModel(ModelParamInputDTO modelParamDTO) {

    String modelId = CoreUtils.getUUID();
    AiModel aiModel = new AiModel();
    BeanUtils.copyProperties(modelParamDTO, aiModel);
    aiModel.setId(modelId);
    aiModel.setOrgId(ORG_ID);
    aiModel.setGmtCreate(new Date());
    aiModel.setModelName(modelParamDTO.getDrugName());
    aiModelMapper.insert(aiModel);
    String s = null;
    int d = s.length();               
}

3、Application代码

@SpringBootApplication
@MapperScan("cn.itpower.pms.modules.**.dao")
@EnableConfigurationProperties
@EnableTransactionManagement
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

代码如上,我自己设置了一个空指针异常,但是事务没有回滚,我试过:

TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
结果事务还是没有回滚,请问究竟是怎么回事呢?

阅读 6.9k
6 个回答

在Application上是否添加了注解

@EnableTransactionManagement

mysql的话,数据库引擎需要设置innodb

你需要贴出的是调用addAiModel方法的那部分代码

能确定下你的表是innoDB吗

ALTER TABLE `database名`.`表名`
ENGINE = InnoDB;

比如mysql建一个Database test,下面的表既可以是myisam 也可以是innodb

clipboard.png

   @PostMapping("/add")
   public RestResult add(ModelParamInputDTO modelParamDTO) {
       this.isValid("modelName", modelParamDTO.getModelName());
       this.isValid("drugId", modelParamDTO.getDrugId());
       this.isValid("drugCode", modelParamDTO.getDrugCode());
       aiModelService.addAiModel(modelParamDTO);
       return ResultGenerator.genSuccessResult().setMessage("保存成功");
   }

如上代码可能存在问题,是否和缺少注解@RequestBody有关?
另外,Controller不要使用dto接收参数,使用VO。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题