освобождение дескриптора turbogears2 для конкретной базы данных (управление менеджером транзакций)

StackOverflow https://stackoverflow.com/questions/8369293

Вопрос

Я создаю приложение turbogears, которое работает с 2 БД - вторая, о которой я говорю, это БД mssql, используемая другим приложением (не моим - мое приложение на самом деле является взломом для решения проблемы, поэтому я не могу управлять другим приложением или настройками БД mssql)

Я пишу в конкретную таблицу БД с помощью sqlalchemy (через turbogears), используя:

 DBSession.add(object)
 DBSession.flush()

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

DBSession.close()

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

transaction.doom()

с похожими эффектами (или вообще без эффекта, я не уверен)

Я читал, что в turbogears менеджер транзакций (я думаю repoze.tm) обрабатывает коммиты но я не могу понять - когда он вызывается?как мне это контролировать?и особенно о том, как удалить дескриптор базы данных, когда функция завершит выполнение по расписанию (я не могу просто завершить скрипт, это задание cron, выполняемое каждый час).документы tg2.1 очень неясны по этому вопросу

Я также где-то читал, что я должен переопределить commit_veto, но не понял - как я должен это сделать и где?и где в моем приложении я должен вызвать transaction.abort() .doom() или что-то еще?

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

спасибо за любую помощь.

данные о версии:

  • турбонаддув 2.1.3
  • sqlalchemy 0.7
  • mssql 2005
  • использование pyodbc для подключения к mssql
Это было полезно?

Решение

DBSession.flush() выполняет SQL, но не фиксирует.Ты должен позвонить DBSession.commit() для завершения транзакции (не нужно явно вызывать flush() в данном случае, commit() сделаю это).После commit() SQLAlchemy запускает новую транзакцию, но это не должно быть проблемой, поскольку данные обычно блокируются только при выполнении некоторого оператора SQL.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top