大事务引发的问题:
- 死锁
- 锁等待
- 回滚时间长
- 接口超时
- 并发情况下数据库连接池被占满
- 数据库主从延迟
解决办法:
- 少用声明式事务注解@Transactional,可以使用编程式事务transactionTemplate.execute()
- 将select方法放到事务外,如何拆分:新加一个Service方法;在该Service类中注入自己;在该Service类中使用AopContext.currentProxy()获取代理对象
- 事务中避免远程调用,远程调用的代码不放在事务中,如何保证数据一致性:重试+补偿机制,达到最终一致性
- 事务中避免一次性处理太多数据,分页处理
- 非事务执行,需要梳理业务
- 异步处理,走mq异步处理逻辑