Состояние гонки в Django при использовании транзакции - PullRequest
1 голос
/ 25 февраля 2020

Используя 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?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...