1、首先说下什么是幂等性呢
对于同一笔业务操作,不管调用多少次,得到的结果都是一样的。
2、幂等性设计
我们以对接支付宝充值为例,来分析支付回调接口如何设计?
如果我们系统中对接过支付宝充值功能的,我们需要给支付宝提供一个回调接口,支付宝回调信息中会携带(out_trade_no【商户订单号】,trade_no【支付宝交易号】),trade_no在支付宝中是唯一的,out_trade_no在商户系统中是唯一的。
回调接口实现有以下实现方式。
方式1(普通方式)
过程如下:
1.接收到支付宝支付成功请求
2.根据trade_no查询当前订单是否处理过
3.如果订单已处理直接返回,若未处理,继续向下执行
4.开启本地事务
5.本地系统给用户加钱
6.将订单状态置为成功
7.提交本地事务
上面的过程,对于同一笔订单,如果支付宝同时通知多次,会出现什么问题?当多次通知同时到达第2步时候,查询订单都是未处理的,会继续向下执行,最终本地会给用户加两次钱。
此方式适用于单机其,通知按顺序执行的情况,只能用于自己写着玩玩。
方式2(jvm加锁方式)
方式1中由于并发出现了问题,此时我们使用java中的Lock加锁,来防止并发操作,过程如下:
1.接收到支付宝支付成功请求
2.调用java中的Lock加锁
3.根据trade_no查询当前订单是否处理