幂等性

经过:

今天去面试了,面试官问我库存做扣减的时候,如何确保幂等性,说实话当时我有点大脑空白,虽然以前也看过幂等性相关的知识,但是不知怎的,竟然词穷了。废话说完了,开始正题。

什么是幂等性

百度了一下,幂等性是用户对同一个操作执行一次和执行多次的结果是一样的;对于数据库的幂等性来说,查询和删除操作是幂等的,也就是说,同一个查询操作,不管查询多少次,结果都是一样的;

对于删除来说,不管删除多少次,最终结果都是把一条数据给删除了,所以幂等性也可以说是针对结果的,也就是多次相同操作,造成的结果一样,那就是幂等的;对于新增和修改则就不是幂等的,所以关于幂等操作,数据库的操作主要是新增和修改

怎么实现幂等性

我当时在回去的路上就百度了一下幂等性,然后又和朋友聊了一下,然后我想到的如下,可能会有理解不到位的地方,欢迎大家多多指正,共同学习,共同进步:

首先要确定是哪种模式下的(单机直接操作数据库、分布式调用库存系统),以下都以减少库存为例:

单机直接操作数据库修改的情况下,如果只是单机调用一个方法减少库存,那么对应的数据库操作就是对库存表的对应的库存数量扣减;那么会有如下操作:

首先查询该种产品是否扣减成功,如果已经扣减成功,则不做操作,如果没有扣减成功,那么则执行扣减操作;

所以操作的时候要增加一个是否扣减成功的标志,就比如如下Sql:

update tbl_stock set num = (原有数量-要扣减的数量), 扣减标识=‘成功’ where id = '' and 扣减标识 <> '成功' 

正常情况下,直接通过主键id去修改数量就可以了,现在再增加 扣减标识 的判断就可以做到幂等,当然'成功'也可以换成是订单ID或线程ID,能确定是同一个操作的值即可;

单机直接操作数据库新增的情况下,比如每次扣减库存是增加一条扣减记录,那么同一个操作,添加两条扣减记录就是不幂等的;怎么确保不管操作多少次,同一个操作的结果都是一样的;

添加唯一列,也就是,添加的记录里有一列是唯一的,那么同一个操作,多次执行,只有一次会成功,其它的都无法添加第二条;

在分布式系统的操作中,在网上看了网友说的使用redis和tocken什么的,还是不太明白,欢迎各位大佬留言。

 

 

 

 

posted @ 2020-06-03 22:25  菜鸟辗迟  阅读(409)  评论(0编辑  收藏  举报