python - django Model 并发写数据出现重复值
高洛峰
高洛峰 2017-04-18 09:53:15
[Python讨论组]

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()?

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回复(1)
PHP中文网

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
    
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号