幂等性
经过:
今天去面试了,面试官问我库存做扣减的时候,如何确保幂等性,说实话当时我有点大脑空白,虽然以前也看过幂等性相关的知识,但是不知怎的,竟然词穷了。废话说完了,开始正题。
什么是幂等性
百度了一下,幂等性是用户对同一个操作执行一次和执行多次的结果是一样的;对于数据库的幂等性来说,查询和删除操作是幂等的,也就是说,同一个查询操作,不管查询多少次,结果都是一样的;
对于删除来说,不管删除多少次,最终结果都是把一条数据给删除了,所以幂等性也可以说是针对结果的,也就是多次相同操作,造成的结果一样,那就是幂等的;对于新增和修改则就不是幂等的,所以关于幂等操作,数据库的操作主要是新增和修改;
怎么实现幂等性
我当时在回去的路上就百度了一下幂等性,然后又和朋友聊了一下,然后我想到的如下,可能会有理解不到位的地方,欢迎大家多多指正,共同学习,共同进步:
首先要确定是哪种模式下的(单机直接操作数据库、分布式调用库存系统),以下都以减少库存为例:
在单机直接操作数据库修改的情况下,如果只是单机调用一个方法减少库存,那么对应的数据库操作就是对库存表的对应的库存数量扣减;那么会有如下操作:
首先查询该种产品是否扣减成功,如果已经扣减成功,则不做操作,如果没有扣减成功,那么则执行扣减操作;
所以操作的时候要增加一个是否扣减成功的标志,就比如如下Sql:
update tbl_stock set num = (原有数量-要扣减的数量), 扣减标识=‘成功’ where id = '' and 扣减标识 <> '成功'
正常情况下,直接通过主键id去修改数量就可以了,现在再增加 扣减标识 的判断就可以做到幂等,当然'成功'也可以换成是订单ID或线程ID,能确定是同一个操作的值即可;
在单机直接操作数据库新增的情况下,比如每次扣减库存是增加一条扣减记录,那么同一个操作,添加两条扣减记录就是不幂等的;怎么确保不管操作多少次,同一个操作的结果都是一样的;
添加唯一列,也就是,添加的记录里有一列是唯一的,那么同一个操作,多次执行,只有一次会成功,其它的都无法添加第二条;
在分布式系统的操作中,在网上看了网友说的使用redis和tocken什么的,还是不太明白,欢迎各位大佬留言。