Django事务原子。。是信任吗?

2024-10-01 07:35:38 发布

您现在位置:Python中文网/ 问答频道 /正文

你见过我看密码吗? 我使用的是django1.8,django rest框架,mysql/innodb。在

我认为你总能得到不同的价值和反应。 但是。。。事实并非如此。在

'01500701.20040128100031383','01500701.20040128100031262'<;--像这样!!!在

有时对其他地方的值做出响应。(其他,另一个客户。。工人1,工人2,工人3) 我能知道为什么会这样吗?在

在[视图.py]在

class NewsUrlList(mixins.ListModelMixin, mixins.CreateModelMixin, generics.GenericAPIView):
    def get(self, request, *args, **kwargs):

        abab = self.check_urlqueuesize()
        logger.debug("NewsUrlList Get Response id=[%s], data=[%s]", request.user.username, abab)
        return Response(abab, status=status.HTTP_200_OK)

    def post(self, request, *args, **kwargs):
        .. blsh blah..

...

@transaction.atomic
def check_urlqueuesize(self):
    if r.llen("url_list") < 5:  # <- redis list
        with transaction.atomic():
            readydata = NewsUrl.objects.filter(status='R')[:100]
            for a in readydata:
                r.rpush("url_list", a.link)  # <- redis list
                a.status = 'W'
                a.save(update_fields=['status'])

        responsjson = {}
        list1 = []

        for c in range(0, 7):
            list1.append(r.lpop("url_list").decode("utf-8"))

        responsjson["urls"] = list1
        return responsjson

在[模型.py]在

^{pr2}$

[日志]

^{3}$

Tags: pyselfurlrequestdefstatusargsmixins
1条回答
网友
1楼 · 发布于 2024-10-01 07:35:38

您的问题有点难以理解,但我认为您的意思是transaction.atomic()似乎没有阻止从数据库返回重复行。在

简单地说,SQL数据库支持不同的事务隔离级别,而最常见的事务隔离级别确实不能保护您编写的代码。我对MySQL/InnoDB的了解还不足以确定,但我怀疑无论您使用的隔离级别如何,在提交对W的更改之前,两个并发进程都有可能读取相同的R行。在

通常的解决方案是切换到不同的隔离级别(例如SERIALIZABLE)或使用显式的行锁定。无论哪种情况,您都必须对数据库及其配置进行更多的研究。在

相关问题 更多 >