一、不添加事务操作多个表
初始数据:
service中具体代码:
public HttpResult tranTest() {
try {
//删除 用户表 中id为11的用户(数据存在)
int i = accountMapper.deleteById(11);
if (i == 0) {
throw new RuntimeException("账号删除失败");
}
//删除 用户角色中间表 中id为6的数据 (数据不存在)
boolean b = accountRoleService.removeById(6);
if (!b) { //如果删除成功抛出异常
throw new RuntimeException("角色删除失败");
}
return HttpResult.success();
} catch (Exception e) {
return HttpResult.failed("操作失败");
}
}
结果:返回操作失败,但是用户表中id=11的数据被删除了
二、添加@Transactional()注解
首先在SpringBoot启动类上添加下面注解开启事务:
@SpringBootApplication
service中具体代码:
@Transactional(rollbackFor = Exception.class)
public HttpResult tranTest() {
try {
//删除 用户表 中id为11的用户(数据存在)
int i = accountMapper.deleteById(11);
if (i == 0) {
throw new RuntimeException("账号删除失败");
}
//删除 用户角色中间表 中id为6的数据 (数据不存在)
boolean b = accountRoleService.removeById(6);
if (!b) { //如果删除成功抛出异常
throw new RuntimeException("角色删除失败");
}
return HttpResult.success();
} catch (Exception e) {
return HttpResult.failed("操作失败");
}
}
结果:事务没有生效,用户表中id=11的数据依旧被删除了
原因:*因为异常被catch 捕获了,导致该类的异常并没有抛出,没有触发事务管理机制*
解决方案:使用try catch 时在catch 中手动回滚
@Transactional(rollbackFor = Exception.class)
public HttpResult tranTest() {
try {
//删除 用户表 中id为11的用户(数据存在)
int i = accountMapper.deleteById(11);
if (i == 0) {
throw new RuntimeException("账号删除失败");
}
//删除 用户角色中间表 中id为6的数据 (数据不存在)
boolean b = accountRoleService.removeById(6);
if (!b) { //如果删除成功抛出异常
throw new RuntimeException("角色删除失败");
}
return HttpResult.success();
} catch (Exception e) {
//@Transactional和try catch捕获异常会让注解失效
//设置手动回滚
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
return HttpResult.failed("操作失败");
}
}
结果:成功实现事务的回滚,当删除角色失败时,账号也不会被删除