4月更文d16n16-基于悲观锁实现请求幂等性

98 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第16天,点击查看活动详情

基于悲观锁实现请求幂等性

前文

前面曾经讨论过几种幂等性的实现方案,利用前端请求携带token、利用数据库唯一索引来解决幂等性以及利用乐观锁实现请求幂等性,今天本文主要内容则为再讨论一下悲观锁的幂等性。本文内容主要为一些个人对于相关知识的理解,难免有不足之处,如有问题还请见谅。

幂等性及悲观锁相关内容

首先来讨论一下相关的前置知识。

先来看一下幂等性。幂等性主要是在同一请求多次发生时,尤其针对新增及更新,要保证数据不会重复的新增,维持数据库仅存在同一条相同的数据。而幂等性由于网络请求的抖动以及分布式系统的设计原因,会成为系统设计的一个重要组成部分。

再来了解一下悲观锁。悲观锁主要是指在事件发生时,悲观的认为数据已经发生改变。具体而言主要是采用一个锁定的方式,限制其他的处理在同一时刻对于同一资源进行操作。这样当下一个请求竞争到锁时,进行查询即可防止相同的数据被反复插入数据库中。

悲观锁实现幂等性

下面再来看一下具体的流程。当请求发生时,我们首先假设同一个请求被发送了两次。第一次请求到达服务器后,首先进行锁的请求。锁的实现方式有很多,但要注意使用分布式锁。例如redis,zookeeper等都可以实现分布式锁。看一下数据流程,第一条请求获取到锁之后,后续的请求都会进入等待状态。此时第一条请求进行数据的插入操作。当插入成功后,请求结束释放分布式锁。此时相同的请求拿到该锁,首先去到数据库查询是否已经有相同的数据。如果已经有了相同的数据,则认为该请求失败。反之,才会认为请求成功。利用这种方式便可以通过悲观锁实现幂等性。当然由于该方式的复杂性,这种方式可能也会存在一定的效率问题。

后记

  • 千古兴亡多少事?悠悠。不尽长江滚滚流。