Проблема Pylons + SQLAlchemy: транзакция неактивна из-за отката в субтранзакции

1

У меня проблема с Pylons + SQLAlchemy.

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

InvalidRequestError: The transaction is inactive due to a rollback in a subtransaction.  Issue rollback() to cancel the transaction.

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

Каков наилучший способ сделать это? Есть ли способ сказать Pylons откатить неудачную транзакцию?

Теги:
sqlalchemy
pylons

2 ответа

1
Лучший ответ

Самое простое - убедиться, что вы используете новый сеанс SQLAlchemy, когда начинаете работать с контроллером. в /project/lib/base.py, добавьте метод для BaseController:

def __before__(self):
    model.Session.close()

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

  • 0
    Спасибо, это похоже на дело
0

Используете ли вы в своих контроллерах yoursapp.lib.base. BaseController?

Вы можете посмотреть на Обработать перезагрузку mysql в SQLAlchemy

Также вы можете поймать исключение SA в блоке try-finally BaseController и выполнить откат сеанса()

В BaseController SA Session удален http://www.sqlalchemy.org/docs/05/session.html#lifespan-of-a-contextual-session

  • 0
    О, спасибо, теперь я вижу, что сессия удаляется () после каждого запроса. Тогда почему ошибка возникает во всех следующих запросах?
  • 0
    Эта ошибка возникает на всех действиях, связанных с SA Session?
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню