实现幂等性的方式,防止并发操作
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分钟,两分钟内还没请求,令牌自动失效。
幂等操作校验,可以通过注解来实现么? 完全可以封装一个注解。