为了账号安全,请及时绑定邮箱和手机立即绑定

django Model 并发写数据出现重复值

django Model 并发写数据出现重复值

弑天下 2019-02-26 00:06:08
view视图代码: @login_required def data(request, page, keyword,strEncode): current_username = request.user data_s = dosomething() #花费比较长的时间 if not UserRecord.objects.filter(user=User.objects.get(username=current_username),MyRecords=keyword): UserRecord.objects.create(user=User.objects.get(username=current_username),MyRecords=keyword) return JsonResponse(data_s, safe=False) 模型代码: class UserRecord(models.Model): user = models.ForeignKey(User) MyRecords = models.CharField(max_length=128) def __unicode__(self): return self.user.username 现在我重复请求(快速,无间隔)5次http://127.0.0.1:8000/1/test/...(类似多线程并发),由于视图里面的dosomething函数会消耗比较长的时间,5个请求会并发进行,由于是并发,数据库中会记录5个test值,本意只想记录一个,怎么解决这个问题?django有没有像线程锁一样的东西,或者临界区类似的?lock.acquire(),lock.release()?
查看完整描述

1 回答

?
跃然一笑

TA贡献1826条经验 获得超6个赞

django默认没有提供锁,你可以使用其他服务提供的锁服务,比如数据库的。
不过看你的需求可以有更简单的做法:

  1. 设置MyRecords字段为unique
    MyRecords = models.CharField(max_length=128, unique=True)

  2. 在create record时catch InterityError异常

    from django.db import IntegrityError

    try:

    UserRecord.objects.create(
        user=User.objects.get(username=current_username), MyRecords=keyword
    )

    except IntegrityError:

    pass
    
查看完整回答
反对 回复 2019-03-04
  • 1 回答
  • 0 关注
  • 919 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信