我很关心一件事情。
使用Django 1.7(最默认安装中的MySQL)我正在向Django REST框架APIView
发布POST。 在那里我做了:Django并发get_or_create
try:
MyModel.objects.get(**some_kwargs)
except MyModel.DoesNotExist:
MyModel.objects.custom_create(**some_kwargs) # This also creates relative models
现在,如果我会做大量的并发请求会发生什么?
正如我猜你期望我只想要第一个并发请求来创建一个对象,任何其他应该得到创建一个。
我准备好了,谢谢Django吗?必须研究隔离,交易,原子性?还是更关于锁定桌子?如何(单位)测试它?
请指导我。
仍然没有运气:(现在我正在尝试postgresql和相同的效果(也试图在MySQL的READ COMMITTED)和一个简单的'MyModel.objects.get_or_create'由Django提供 - 有时它可以(只有一个创建),有时第二个线程再次创建,然后第三个抛出'MultipleObjectsReturned'。用这个测试:https://www.caktusgroup.com/blog/2009/05/26/testing-django-views-for-concurrency-issues/ – McAbra 2015-04-04 21:46:17
@McAbra你是否在数据库级别的'** some_kwargs'上强制执行唯一性?否则,没有一种可以防止重复的方法。 – knbk 2015-04-04 21:50:44
我刚刚在这个模型的三个attrs上做了一个'unique_together',它没有帮助,那是什么你的意思是吗? – McAbra 2015-04-04 22:07:28