## 数据库事务与锁与远程API请求处理
1. 以下示例为用户分账逻辑处理过程
2. api调用为耗时过程,建议与数据表事务分离处理
3. 加入redis锁后事务提交慢仍然会造成多次写入,原因为5.7版本以后的插入造成的幻读问题与redis锁被其他进程解锁。
### 理想流程:优点在于用户账户会在多处程序更新,日志只会在对应位置更新一次,减少mysql锁竞争时间
1. 事务A
1. 程序计算,开始事务A
2. 用户账户最终金额更新到数据库
3. 记录本次增加或减少金额日志,标记为‘未开始’,提交事务A
4. 启动api调用队列
2. 事务B,日志表不会出现并发更新情况。
1. 根据日志调用API相关接口完成转账,设计默认重试次数为3次
2. API请求成功,在事务B内统一更新日志为完成。
### 次级流程,在一个大事务中完成所有步骤
1. 流程
1. 完成程序计算,用户账户最终金额更新到数据库,并记录本次增加或减少金额日志
2. 根据日志同步调用API相关接口完成转账,请求成功后提交事务。
2. 缺点
1. 事务锁表时间过长,锁竞争激烈
### 最差流程,在一个大事务中完成所有步骤
1. 流程
1. 完成程序计算,用户账户最终金额
2. 根据日志同步调用API相关接口完成转账
3. 请求成功后,更新到数据库,并记录本次增加或减少金额日志,提交事务
2. 缺点
1. 事务锁表时间过长,锁竞争激烈
2. 与方案2的区别在于是否先锁住表
3. api成功后事务提交失败,可能导致多次分账