Я не эксперт по транзакциям / базам данных, поэтому простите мое невежество в формулировке здесь:
Когда вы используете 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()
выдает ошибки, вызовы подфункций уже передали свои транзакции в БД, что логически повредило мои данные.
Есть ли способ обойти это? Опять же, простите меня, если я что-то неправильно понимаю, но, похоже, я наблюдал такое поведение, и обходной путь был бы очень удобен.