幂等的实现方案

幂等在开发中的概念

对于同一个系统,在同样条件下,一次请求和重复多次请求对资源的影响是一致的,就称该操作为幂等的。

常见的幂等的例子

银行系统中,一笔转账应当只扣一次钱。

商城系统中,一个订单只能提交一次,提交了订单只扣一次钱。

论坛系统中,一个用户对一篇文章只能点一次赞。

幂等方案一:防重token令牌

针对客户端连续点击或者调用方的超时重试等情况,例如提交订单,此种操作就可以用 Token 的机制实现防止重复提交。

简单的说就是调用方在调用接口的时候先向后端请求一个全局 ID(Token),请求的时候携带这个全局 ID 一起请求(Token 最好将其放到 Headers 中),后端需要对这个 Token 作为 Key,用户信息作为 Value 到 Redis 中进行键值内容校验,如果 Key 存在且 Value 匹配就执行删除命令,然后正常执行后面的业务逻辑。如果不存在对应的 Key 或 Value 不匹配就返回重复执行的错误信息,这样来保证幂等操作。

Token 在何时生成,怎么生成?这是该机制的核心,比如在商城系统中,如果在提交订单的时候生成那么每次提交订单都会生成一个新的token,那就不幂等了。必须用户进入订单页面时就应该生成token,用户提交订单的时候携带者token一起提交,这样用户不管提交多少次订单最多就只能成功一次。

所以 Token 生成的时机必须保证能够使该操作具多次执行都是相同的效果才行

方案二:版本状态标志

给数据增加一个版本状态标志。通过这个状态标志,保证每个业务只在对应的状态下才会执行。如果标志已经进入了下一个状态,再有相同的请求来到当前标志时就不允许变更状态,保证了业务的幂等性。

此方案比较适合更新操作,比如下面的SQL

复制代码
update 账户表 set 余额 = 余额-100 , version = version+1 where 账户ID = id and version = 6

这样只会在version=6的时候才能成功扣减余额,重复执行该条SQL将不会生效,保证更新的幂等。但是需要额外的增加一个字段或者状态标志。

方案三:数据库唯一索引

利用数据库的唯一索引特性来实现幂等。

比如一个手机号只能创建一个账户,那么在手机号字段上创建一个唯一索引。同一个手机号无论提交多少次创建账户的请求都只能创建一个账户。

相关推荐
SamDeepThinking19 分钟前
现场重构一段代码,展示什么叫「好代码,都在表达自己的意图」
java·后端·程序员
小园子的小菜35 分钟前
Java 并发四大工具类深度解析:CountDownLatch、CyclicBarrier、Semaphore、Exchanger 原理、源码与面试考点
java·开发语言·面试
搭贝低代码37 分钟前
设备管理系统迁移改造:从手工台账到二维码数字化的实践路径
java·低代码·搭贝
前端双越老师39 分钟前
Nest.js 和 Spring Boot 为何如此像?写给前端转 Java 的同学
java·spring boot·全栈
JL151 小时前
Java+Go 混合架构怎么搭?收官 50 道面试题 + 学习路线
java·架构·golang
Tattoo_Welkin1 小时前
IDEA 中常用操作记载
java·elasticsearch·intellij-idea
音符犹如代码1 小时前
Arthas classloader + sc 实战:JVM 类加载与手动加载
java·jvm·spring boot
乐启国际旅行社有限公司1 小时前
Java线程池实战:文旅系统批量任务性能优化(团期生成/数据导出)
java·开发语言·性能优化
Listen·Rain2 小时前
用AI开发出一个AI
java·人工智能·spring boot·tomcat·intellij-idea·mybatis·visual studio
AI人工智能+电脑小能手2 小时前
【大白话说Java面试题 第203题】【09_Zookeeper篇】第4题:ZooKeeper 的节点类型有哪些?
java·zookeeper·分布式锁·分布式协调·znode