освобождение дескриптора turbogears2 для конкретной БД (управление диспетчером транзакций) - PullRequest
1 голос
/ 03 декабря 2011

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

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

 DBSession.add(object)
 DBSession.flush()

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

DBSession.close()

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

transaction.doom()

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

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

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

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

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

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

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

1 Ответ

0 голосов
/ 05 декабря 2011

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

...