数据库事务与锁与远程API请求处理

## 数据库事务与锁与远程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成功后事务提交失败,可能导致多次分账