什么是幂等性
- 一次和多次请求某一个资源对于资源本身应该具有同样的结果。就是说,其任意多次执行对资源本身所产生的影响均与一次执行的影响相同。
f(n) = 1^n
为什么需要幂等性?
- 用户在APP上连续点击了多次提交订单,总不能生成多个订单吧。
- 用户因为网络卡了,连续点击发送消息,接收者总不能收到重复的同一条信息吧。
- 用户发起一笔付款请求,就应该只扣用户一次钱
常用手段
- 数据库建立唯一性索引,可以保证最终插入数据库的只有一条数据
- token机制,每次接口请求前先获取一个token,然后再下次请求的时候在请求的header体中加上这个token,后台进行验证,如果验证通过删除token,下次请求再次判断token
- 悲观锁或乐观锁,悲观锁可以保证每次for update的时候其他sql无法update数据(在数据库引擎是innodb的时候,select的条件必须是唯一索引,防止锁全表)
- 先查询后判断,首先通过查询数据库是否存在数据,如果存在证明已经请求过了,直接拒绝该请求,如果没有存在,就证明是第一次进来,直接放行。