# 抛问题说答案
项目过程中你遇到了什么样的难解决问题?你是如何解决的?
<br/>
## 什么样的问题是难解决的
- 常见问题 or 偏门问题
- 正常问题 or 踩坑问题
面试官主要是想看下你做的内容的深度实操经验以及你解决问题的思考和手段
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
## 交易一致性问题
- 重复支付
- 超时退问题
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
## 重复支付
- 支付系统因为各种原因重复回调
考察点:幂等方法
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
## 超时退问题
- 如何回滚内容
- 回滚失败如何解决
- 重复回滚如何预防
考察点:分布式事务,流水号应用,重试方式
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
## 分布式原理
- CAP
一致性(Consistency) : 客户端知道一系列的操作都会同时发生(生效)
可用性(Availability) : 每个操作都必须以可预期的响应结束
分区容错性(Partition tolerance) : 即使出现单个组件无法可用,操作依然可以完成
- Base
Basically Available(基本可用)
Soft state(软状态)
Eventually consistent(最终一致性)
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
## 分布式事务
- 二阶段提交
- 异步确保型
- 事务型消息
- TCC型
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
## 强一致性保证
- 二阶段提交
- 读写相等
- Raft协议
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
## TCC
- try
- confirm
- cancel
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
交易表
| id | status | item_id |
| --- | --- | --- |
| 2020103020102 | init | 87 |
status状态分布:
init初始化
stock_success 库存冻结成功
voucher_success 优惠券冻结成功
paying 支付中
fail 支付失败待回滚
voucher_rollback 优惠券回滚成功
stock_rollback 库存回滚成功
<br/>
<br/>
<br/>
库存表
| item_id | amount | |
| --- | --- | --- |
| 87 | 20 |
库存流水表
| xid | status | item_id | amount |
| --- | --- | --- | --- |
| 2020103020102 | init | 87 | 1 |
status状态分布:
init初始化
success 库存冻结成功
rollback 库存回滚
优惠券表
| user_id | amount | |
| --- | --- | --- |
| 7 | 30 |
优惠券流水表
| xid | status | user_id | amount |
| --- | --- | --- | --- |
| 2020103020102 | init | 7 | 1 |
status状态分布:
init初始化
success 优惠券冻结成功
rollback 优惠券回滚
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
## 异步确保型
采用异步消息的方式确保事务可以最终一致
交易表
fail 支付失败待回滚
voucher_back 优惠券退成功
stock_back 优惠券退成功
流水表
加入back状态
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
## 事务型消息
使用事务型消息确保发送方的落地能力
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>