1

私は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に接続する
4

1 に答える 1

0

DBSession.flush()SQL を実行しますが、コミットしません。トランザクションを完了するために呼び出す必要があります (この場合、DBSession.commit()明示的に呼び出す必要はありません。呼び出します)。SQLAlchemy が新しいトランザクションを開始した後ですが、通常、データは SQL ステートメントを実行するときにのみロックされるため、これは問題になりません。flush()commit()commit()

于 2011-12-05T15:39:37.497 に答える