Какие типы запросов подходят для `@transaction.non_atomic_requests`?

Распространенный способ обработки транзакций в Интернете заключается в том, чтобы оборачивать каждый запрос в транзакцию. В Django вы можете установить для ATOMIC_REQUESTS значение True в конфигурации каждой базы данных, для которой вы хотите включить это поведение.

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

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

Для запросов, которые не нужно оборачивать в транзакции, вы можете применить декоратор @transaction.non_atomic_requests.

Дан Django view.py с несколькими классами View и методами запроса. Как я могу решить, какие запросы будут хорошими кандидатами для неатомарного декоратора?

Какие "подводные камни" могут скрываться?

Я мог видеть, что POST методы не являются хорошими кандидатами или чем-то еще с .save(), но на что еще я должен обратить внимание?


person Matt    schedule 04.10.2017    source источник


Ответы (1)


К сожалению, я не думаю, что есть много подсказок, подсказок и т. д., которые обычно применимы. Вопрос только в том, требует ли эта последовательность операций транзакцию базы данных для правильной работы, учитывая все операции с базой данных, которые я мог бы выполнить? Если ответ да (или вы не уверены), используйте транзакцию; если нет, то не надо.

Это очень специфичный для приложения вопрос. Взяв ваш пример, во многих ситуациях save() потребуется транзакция, а во многих - нет. Я не знаю никакой замены тому, чтобы просто сесть и подумать о возможностях.

Самое главное — хорошо понимать транзакции базы данных, особенно уровни изоляции. Люди часто ошибочно думают, что они защищены от какой-либо проблемы параллелизма, потому что их мысленная модель транзакций соответствует уровню изоляции SERIALIZED, тогда как на самом деле их операции используют READ COMMITTED (по умолчанию Django).

Также важно понимать и учитывать другие доступные инструменты, которые вы можете использовать в дополнение к простым транзакциям, такие как блокировки (например, select_for_update()) и оптимистичный параллелизм.

person Kevin Christopher Henry    schedule 05.10.2017