系统设计之接口幂等

系统设计之接口幂等

一个操作如果具有任意多次执行所产生的影响均与一次执行的影响相同,我们就称之为幂等

JVM 锁

适用于单机应用

悲观锁

例如支付相关

select * from t_order where order_id = trade_no for update;

串行化,不利于并发

乐观锁

update t_order set status = **1** where order_id = trade_no where status = **0**;
//上面的update操作会返回影响的行数num
if(num==**1**){
//表示更新成功
提交事务;
}else{
//表示更新失败
回滚事务;
}

类似于CAS, 保证并发的情况,只有一个线程更新成功

唯一约束

创建一个表记录处理记录,定义一个ref _ID 引用全局唯一订单号。

try{
insert into t_uq_dipose (ref_type,ref_id) values ('充值订单',trade_no);
//提交本地事务:
}catch(Exception e){
//回滚本地事务;
}

去重

针对外部API 接口,source + seq , 数据库记录source + seq 对应的操作信息(状态,结果)

或者checkout source + payload

收到请求先check该强求的处理状态。

分布式锁

分布式系统之,例如支付用户id+ 后缀 作为锁ID, 先获取分布式锁然后做操作。

前端页面的防止重复提交的控制


https://mp.weixin.qq.com/s/46b_jVU1G98ThplvB62H9g https://mp.weixin.qq.com/s/7-K-nbeHnN3b24aGrI1L-Q https://mp.weixin.qq.com/s/7-K-nbeHnN3b24aGrI1L-Q