Когда пирамида совершает транзакцию zodb?

Я следовал руководству по http://docs.pylonsproject.org/docs/pyramid/en/latest/tutorials/wiki/index.html

Я знаю, что когда я добавляю или изменяю постоянные объекты (в данном случае объекты Page), изменения не будут сохраняться до transaction.commit() называется. А чтобы отменить изменения могу позвонить transaction.abort(),

Однако в учебном пособии эти вызовы не отображаются в вызываемых представлениях. Я предполагаю, что есть некоторое промежуточное программное обеспечение, которое будет перехватывать исключения и вызывать .abort() или позвоните по телефону .commit() перед отправкой HTTP-ответа, но я не вижу упоминаний об этом нигде в коде или конфигурационных файлах.

Не могли бы вы указать мне правильное направление? Мне просто нужно знать, что происходит за кулисами, поэтому я знаю, нужно ли мне что-то добавлять самостоятельно

1 ответ

Решение

pyramid_tm пакет используется; он устанавливает Tween, который управляет транзакцией.

Он просто запускает транзакцию для каждого запроса, и, если запрос был успешным, транзакция фиксируется и отменяется в противном случае.

Из документации:

В начале запроса новая транзакция запускается с использованием transaction.begin() функция. После того как запрос завершил все свои работы (т. Е. Представления завершили работу), проверяются несколько проверок:

  • Сделал некоторые transaction.doom() сделать транзакцию "обреченной"? если так, transaction.abort(),
  • Произошло ли исключение в базовом коде? если так, transaction.abort() Если tm.commit_veto использовался параметр конфигурации, возвращал ли ответный вызов commit вето, вызванный с ответом, сгенерированным приложением, результат, который оценивается как True? если так, transaction.abort(),

Если ни одна из этих проверок не вызывает transaction.abort() тогда транзакция вместо этого совершается с использованием transaction.commit(),

Он также будет повторять запросы (перезапускать их с самого начала), если возникла повторяющаяся исключительная ситуация (например, конфликт фиксации ZODB):

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

Это поведение по умолчанию отключено; Вы можете установить tm.attempts опция для числа больше 1, чтобы включить его.

Другие вопросы по тегам