springboot事务不生效
1.首先springboot事务回滚不生效,通常是service实现类抛出异常,controller捕获,并设置手动提交事务
1.serviceImpl代码
@Transactional(rollbackFor = Exception.class)
public int SaveAs(String UserId,Long Pid,String PName) throws Exception {
try{ //查询原有项目的信息
ProjectMessage message = projectMessageService.queryProjectMessage(UserId, Pid);
//插入工程项目信息
message.setUserId(UserId);
message.setPName(PName);
message.setPid(null);
}catch (Exception e){
throw new Exception();
}
return 0;
}
首先在你要在springboot启动类上加 @EnableTransactionManagement 注解,开启事务支持,之后在你要用事务的方法上加入 @Transactional(rollbackFor = Exception.class) 注解,把要执行代码放到try里面,并catch捕获异常(也可以加在类上表示这个类的所有方法的支持事务)
2.controller代码
@GetMapping("/SaveAs")
@Transactional(rollbackFor = Exception.class)
public Result<?> SaveAs(@RequestParam String UserId, @ApiParam("新起的项目名字")@RequestParam String PName,@ApiParam("要复制的项目ID") @RequestParam Long Pid) throws InterruptedException {
try {
uaProjectService.SaveAs(UserId, Pid, PName);
} catch (Exception e) {
//事务回滚
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
return Result.error("1","另存为失败,请重试");
}
return Result.success();
}
之后在controll先加上 @Transactional(rollbackFor = Exception.class) 注解,然后对service的事务方法进行try catch捕获异常,在catch里回滚事务
2.如果你前面都对了然后测试的时候事务还是不回滚,放心这不是你的问题是数据库的问题
1.首先数据库的引擎在5.7之后都默认是InnoDB的,他是支持事务和外键的,这里我用nacivate演示
这样你再试试是不是可以了,如果还是不行,那我就不知道了(注意我这里使用phpStuudy自带的数据库,它自带的引擎是Mylsam既不能建立外键也不支持事务,可以修改一下,以防下次再出现这种问题)
3.PhpStudy数据库修改
总结
事务不生效,首先看看代码是否有错误,之后查看数据库,这样问题应该就能解决