Как мне использовать Django -setting ATOMIC_REQUESTS? Это не работает, как я ожидал - PullRequest
1 голос
/ 19 января 2020

macOS, Django 1.11, mysql 5.7,

Я хочу знать, как работает ATOMIC_REQUESTS, как я могу его использовать.

# some code in settings.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'HOST': '127.0.0.1',
        'NAME': 'kma_dev',
        'USER': 'root',
        'PASSWORD': 'root',
        'ATOMIC_REQUEST': True,
    }
}

Когда я поднимаю Ошибка в представлении, mysql операция не откатилась.

# test raise Error in view like this⬇️⬇️


class StoreGroup(View):

    def get(self, request):
        s = Store.objects.first()
        s.name = s.name + 'ABC'
        s.save()
        raise ValueError

Большое спасибо.

1 Ответ

1 голос
/ 19 января 2020

Прежде всего, я думаю, вам нужно хорошо изучить точки сохранения, как описано в документах .

Причина, по которой ваши изменения были применены, заключается в том, что s.save () реализован до поднятия исключения. с помощью s.save () вы добавляете точку сохранения и поведение по умолчанию Django в транзакциях atomi c (вы можете прочитать коды django .db.transaction.Atomi c особенно в части def __exit__(self):), она фиксирует последнюю точку сохранения, существующую в транзакции.

Более подробную информацию и примеры можно найти в документах, например, как откатиться до указанной c точки сохранения и т. д. подробности о точках сохранения, откате и фиксации.

Объяснение о ATOMIC_REQUESTS:

Django По умолчанию ATOMIC_REQUESTS устанавливает False. Установив ATOMIC_REQUESTS в True, вы добавите следующие изменения. По документам:

Работает так. Перед вызовом функции просмотра Django начинает транзакцию. Если ответ получен без проблем, Django фиксирует транзакцию. Если представление создает исключение, Django откатывает транзакцию.

Это означает, что вы измените поведение по умолчанию следующим образом, и Django предупредит вас об этом:

Хотя простота этой модели транзакций привлекательна, она также делает ее неэффективной при увеличении трафика c. Открытие транзакции для каждого представления имеет некоторые издержки. Влияние на производительность зависит от шаблонов запросов вашего приложения и от того, насколько хорошо ваша база данных обрабатывает блокировку.

Он предупреждает вас об осторожном использовании этого параметра, поскольку при установке этого значения каждый из ваших вызовов представления будет быть в одной транзакции, и все же вы должны быть осторожны с производительностью (например, заботой о блокировке таблиц и строк, заботой о внешних вызовах API) и реализацией (например, this link ) трудностей, с которыми вы столкнетесь.

Кстати, вы можете добавить эту функциональность в представление или функцию с помощью декоратора @transaction.atomic или нескольких строк кода, используя оператор with transaction.atomic():. Это заставляет вас использовать атоми c транзакции именно тогда, когда вам это нужно.

Я настоятельно рекомендую вам прочитать этот раздел .

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