当前位置: 代码迷 >> 综合 >> 20200117 接口幂等性实现的几种方式
  详细解决方案

20200117 接口幂等性实现的几种方式

热度:40   发布时间:2024-01-25 12:25:32.0

实现幂等性的方式,防止并发操作

1、redis:setNX实现分布式锁,防止多个相同操作同时执行。

2、mysql:select......for update 但是请注意有可能会锁住整张表,如果查询范围比较大,如果是确定的

3、前后端交互:前端调用接口时,先从后端获取一个令牌;请求接口时,后端直接删除当前令牌,如果删除成功,继续执行;如果删除失败,返回正在处理中。

 

SETNX key value

将ke的值设为value,当且仅当key不存在。若给定的key已经存在,则SETNX 不做任何动作。

返回值:设置成功,返回1。设置失败,返回0。

SETNX 是『SET if Not eXists』(如果不存在,则 SET)的简写。

 

行锁,排它锁:

for update是在数据库中上锁用的,可以为数据库中的行上一个排它锁。当一个事务的操作未完成时候,其他事务可以读取但是不能写入或更新。

如果查询不到,锁失效? 如果查询不到,同时进行插入操作,还是会插入多条重复的记录。

 

注意:当选中某一个行的时候,如果是通过主键id选中的,那么这个时候是行级锁。 

其他行还是可以直接insert 或者update的。如果是通过其他的方式选中行,或者选中的条件不明确包含主键,这个时候会锁表。其他的事务对该表的任意一行记录都无法进行插入或者更新操作,只能读取。

 

锁定一行还是锁定多行,还是锁表? 这个尽量别使用,如果锁表将会导致整个项目性能低下。

 

删除操作:设置过期时间为2分钟,两分钟内还没请求,令牌自动失效。

幂等操作校验,可以通过注解来实现么? 完全可以封装一个注解。