问题产生 :
环境 :
MySQL的隔离级别设置为读已提交
项目需要和硬件打交道 某天出现合作厂商出现bug 重复数据多进程同时推送(10毫秒内推送多条)
代码中先select 再insert插入逻辑失效 出现重复插入的问题
处理方案1:
多字段建立联合索引再数据库 重复插入失败
处理方案2:
修改MySQL事务隔离级别(猜测),因为没有修改权限未尝试 (会降低MySQL性能 不推荐)
处理方案3:
在第三方加锁 未获取到锁的情况下不操作 我选择了基于redis实现
关键代码如下
r = redis.Redis(host='127.0.0.1', port=6379, db=0) # 本地测试
lock_key = "lock" + data["name"] + str(data['attendTime'])+str(data['attendType'])
reply = r.setnx(lock_key, 1) # 若 value 存在 则返回 False.
if reply:
r.expire(lock_key, 30) # 加过期时间
redis_lock = False
else:
redis_lock = True
if not redis_lock and **:
insert into ***
其他人的参考:简单实现一个Redis分布式锁——Python_也无风雨也无晴-CSDN博客_python redis分布式锁