特定のDB(トランザクションマネージャーの制御)でTurbogears2ハンドルをリリースする
-
27-10-2019 - |
質問
私は2 dBで動作するターボギアーズアプリケーションを構築しています - 2番目のアプリケーション - 私が言及しているのはMSSQL DBです - 別のアプリケーションで使用されます(私のものではありません - 私のアプリケーションは実際には問題を解決するためのハックです - だから私はできます'他のアプリケーションまたはMSSQL DB設定を制御します)
私は次のことを使用して(ターボギアを介して)sqlalchemyを使用して特定のDBテーブルに手紙を書きます。
DBSession.add(object)
DBSession.flush()
データはDBに書き込まれますが、TurbogearsアプリケーションはDBの何らかのハンドルを保持しているため、そのDBテーブルを使用したメインアプリケーションはそれから読み取ることができますが、変更できません。 Turbogearsアプリケーションを停止するまで、すべてが機能します。私は電話しようとしました:
DBSession.close()
しかし、その後、データはDBから魔法のように削除されました - おそらくトランザクションロールバックです。私も電話をかけようとしました:
transaction.doom()
似たような効果があります(またはまったく効果がありません私にはわかりません)
Turbogearsでは、トランザクションマネージャー(repoze.tm)がコミットを処理すると思いますが、私は把握できません - いつ呼ばれますか?どうすれば制御できますか?特に、機能が終了したときにDBハンドルを削除する方法は、スケジュールされた実行(スクリプトを終了することはできません。それは1時間ごとに実行されるCronの仕事です)。 TG2.1ドキュメントは、このテーマでは非常に不明です
また、commit_vetoをオーバーライドする必要がある場所で読みました - しかし、理解していませんでした - どうすればいいですか?そして、私のアプリケーションのどこでtransaction.abort().doom()または何でも電話する必要がありますか?
また、トランザクションフックを使用して同じ機能を試しましたが、実際にフックを呼び出すことはできませんでした
助けてくれてありがとう。
バージョンデータ:
- Turbogears 2.1.3
- Sqlalchemy 0.7
- MSSQL 2005
- PyoDBCを使用してMSSQLに接続します
解決
DBSession.flush()
SQLを実行しますが、コミットしません。あなたは電話しなければなりません DBSession.commit()
トランザクションを終了するには(明示的に呼び出す必要はありません flush()
この場合、 commit()
それをします)。後 commit()
SQLalchemyは新しいトランザクションを開始しますが、通常はSQLステートメントを実行した場合にのみデータがロックされるため、これは問題ではありません。