你见过我看密码吗? 我使用的是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}$
您的问题有点难以理解,但我认为您的意思是
transaction.atomic()
似乎没有阻止从数据库返回重复行。在简单地说,SQL数据库支持不同的事务隔离级别,而最常见的事务隔离级别确实不能保护您编写的代码。我对MySQL/InnoDB的了解还不足以确定,但我怀疑无论您使用的隔离级别如何,在提交对
W
的更改之前,两个并发进程都有可能读取相同的R
行。在通常的解决方案是切换到不同的隔离级别(例如
SERIALIZABLE
)或使用显式的行锁定。无论哪种情况,您都必须对数据库及其配置进行更多的研究。在相关问题 更多 >
编程相关推荐