освобождение дескриптора turbogears2 для конкретной базы данных (управление менеджером транзакций)
-
27-10-2019 - |
Вопрос
Я создаю приложение 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.