一、业务场景
1、springboot搭建项目,因为有些查询方法不需要开启事务,所以没有在service服务实现类上面直接添加,而是在service服务实现类中某些需要事务的方法上面添加事务回滚注解@Transactional(rollbackFor = Exception.class),但是在操作业务的时候同时向多个表插入数据,其中有一个插入异常,别的插入正常,事务正常情况下插入正常的数据是会回滚的,不会保存在数据库;但是异常情况下:比如代码编写不当或者表中的引擎不对,事务是无法生效的。
二、异常情况处理
1、代码编写不当,方法:在try-catch异常捕获的时候要手动在catch语句块中抛出异常,不然事务会失败,例如:
/**
* <pre>
* 网关属性表 服务实现类
* </pre>
*
* @author Mr.Qu
* @since 2020-01-07
*/
@Slf4j
@Service
public class GatewayServiceImpl extends BaseServiceImpl<GatewayMapper, Gateway> implements GatewayService {
@Autowired
private GatewayMapper gatewayMapper;
@Transactional(rollbackFor = Exception.class)
@Override
public boolean saveGateway(Gateway gateway) throws Exception {
boolean res = false;
try {
res= super.save(gateway);
// 此处设计一个异常
int a = 100/0;
} catch (Exception e) {
throw new RuntimeException(e.getMessage());
}
return res;
}
}
注意:@Transactional 注解只应用到 public 修饰的方法上,在 protected、private 修饰的方法上都不会起作用
2、数据库中表设计的有问题
特性 | InnoDB | MyISAM | MEMORY |
事务安全 | 支持 | 无 | 无 |
存储限制 | 64TB | 有 | 有 |
空间使用 | 高 | 低 | 低 |
内存使用 | 高 | 低 | 高 |
插入数据速度 | 低 | 高 | 高 |
外键支持 | 支持 | 无 | 无 |
通过上面的对比发现:InnoDB支持事务 ,其余两个不支持事务。
查看自己设计的表中引擎是否为InnoDB两种方式:
方式一、show TABLE STATUS FROM 你的数据库名称 WHERE name = '你的表名';
方式二、鼠标选中表然后右键,选择设计表、接着点击选项。就会看到表的情况;