私は2dbで動作するturbogearsアプリケーションを構築しています-2番目のもの-私が参照しているのはmssqldbです-別のアプリケーションによって使用されます(私のアプリケーションではありません-私のアプリケーションは実際には問題を解決するためのハックです-だから私はできます他のアプリケーションまたはmssqldb設定を制御しません)
私はsqlalchemy(turbogearsを介して)を使用して特定のdbテーブルに書き込んでいます:
DBSession.add(object)
DBSession.flush()
データはdbに書き込まれますが、turbogearsアプリケーションはdbに何らかのハンドルを保持しているため、そのdbテーブルを使用するメインアプリケーションはデータベースから読み取ることはできますが、変更することはできません。TurboGearsアプリケーションを停止してから、すべてが機能するまで。私は電話をかけようとしました:
DBSession.close()
しかし、その後、データはデータベースから魔法のように削除されました-おそらくトランザクションのロールバックです。私も電話をかけようとしました:
transaction.doom()
同様の効果がある(またはまったく効果がないかどうかはわかりません)
ターボギアでは、トランザクションマネージャー(repoze.tm)がコミットを処理することを読みましたが、理解できません-いつ呼び出されますか?どうすればそれを制御できますか?特に、関数がスケジュールされた実行を終了したときにdbハンドルを削除する方法(スクリプトを終了するだけではなく、1時間ごとに実行されるcronジョブです)。tg2.1ドキュメントはこの主題に関して非常に不明確です
また、commit_vetoをオーバーライドする必要がある場所を読みましたが、理解できませんでした。どのように、どこでそれを行う必要がありますか?アプリケーションのどこでtransaction.abort().doom()などを呼び出す必要がありますか?
トランザクションフックを使用して同じ関数も試しましたが、実際にフックを呼び出すことができませんでした
助けてくれてありがとう。
バージョンデータ:
- ターボギア2.1.3
- sqlalchemy 0.7
- mssql 2005
- pyodbcを使用してmssqlに接続する