Django - обработка транзакций в начальном стиле - PullRequest
3 голосов
/ 23 марта 2011

Я не эксперт по транзакциям / базам данных, поэтому простите мое невежество в формулировке здесь:

Когда вы используете Django transaction.commit_on_success(func), любая ошибка, переданная в элемент управления commit_on_success, откатит транзакцию, что действительно полезно, конечно, если вам нужно какое-то действие "все или ничего" в методе и т. Д. Это делает обработку транзакций на основе представлений в Django превосходной для представлений, которые делают много всего.

Иногда я обертываю методы модели или простые старые вспомогательные функции в commit_on_success для достижения того же поведения "все или ничего".

Проблема возникает, когда вы вложили транзакции Django. Пример: представление, защищенное транзакцией, вызывает метод модели, заключенный в commit_on_success, а затем выполняет другие действия с другой моделью и вызывает исключение. К сожалению, когда управление вернулось в commit_on_success из метода модели, транзакция была зафиксирована, и теперь в представлении произошла ошибка, изменив мое представление на «все или некоторые» вместо «все или ничего». Это не ограничивается просмотром. У меня могут быть вложенные операции, в которых все lots_o_foo_or_nothing() используют commit_on_success и вызовы all_or_nothing_1() и all_or_nothing_2(), которые оба заключены в commit_on_success. Если lots_o_foo_or_nothing() выдает ошибки, вызовы подфункций уже передали свои транзакции в БД, что логически повредило мои данные.

Есть ли способ обойти это? Опять же, простите меня, если я что-то неправильно понимаю, но, похоже, я наблюдал такое поведение, и обходной путь был бы очень удобен.

1 Ответ

2 голосов
/ 24 марта 2011

не окончательное решение, а идея, основанная на этом фрагменте (что само по себе является хорошей идеей)

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

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