Когда пирамида совершает транзакцию 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, чтобы включить его.