4月更文d15n15-基于数据库乐观锁的幂等性处理

175 阅读2分钟

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

基于数据库乐观锁的幂等性处理

前文

之前曾经讨论过利用前端请求携带token以及利用数据库唯一索引来解决幂等性的问题,今天主要内容为另一种幂等性的解决方案,基于数据库的乐观锁进行并发请求幂等性处理。文章内容主要为个人的一些理解,难免有不足之处,还请见谅。

幂等性及乐观锁

首先了解一下本文中会涉及到的两个基本概念,幂等性及乐观锁。

幂等性主要指的是在并发系统系统中,当反复的发送相同请求信息,会得到相同的结果,同时多条创建请求同样只会有其中一条生效。

乐观锁指的主要是当数据库发生数据变化时,我们原则上认为不会出现冲突,因此不提前进行数据的查询,而是在更新时进行条件的校验。

利用乐观锁实现幂等性

下面来看一下如何利用乐观锁实现请求的幂等性。首先我们需要在数据库中添加一个version字段,代表请求当前执行到的版本号。每一个请求在发生前,首先增加一次请求,用来查询当前的版本号信息。

select version from db

拿到版本号返回给前端后,前端执行真正的新增逻辑前,需要将版本号同时传递给后端服务。现在来还原一下场景,当前数据库版本为1,前端需要执行一次新增操作。首先后端收到了若干条前端发出的请求信息,请求内容相同且版本号均为1。第一条数据会首先进行数据库更新请求,新增一条数据并将版本号设置为2。此时相同数据的下一条进行请求更新。由于数据库最新版本已经为2,而当前携带的版本号为1,因此很明显该消息为过期历史消息,自动进行废弃。而版本号的判断直接在sql中增加更新条件即可实现。简单看一下该方案的操作流程:

image.png

后记

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