Используя Django, я получил следующую (минимальную) модель:
from django.db import models
from django.contrib.postgres.fields import JSONField
class MyModel(models.Model)
files = JSONField(default=list)
В представлении у меня есть следующий код, чтобы добавить данные в поле files
:
from django.db import transaction
def my_view(request):
[...]
with transaction.atomic():
entry = MyModel.objects.select_for_update().get(id=some_id)
entry.files += [some_value_a, some_value_b]
entry.save()
[...]
При выполнении запросов один за другим код работает нормально.
Однако, при выполнении нескольких запросов в parralel, некоторые значения теряются . Кажется, это условие гонки, но поскольку добавление выполняется в блоке транзакции atomi c, этого не должно происходить.
Например, если я выполняю запрос 5 раз в parralel, я получаю с 8 значениями в поле (вместо 10), с 5 HTTP_200_OK
ответами.
Как получить блок trully atomi c?