質問

アクティブなコミットされていないトランザクションで、PostgreSQLにセッション(SQLAlchemy)があります。 を介してSQL INSERT / UPDATE / DELETE ステートメントを発行したかどうかにかかわらず、セッションをコールツリーに渡しました。 sqlalchemy.orm または基になる接続を介して直接。

このトランザクションに保留中のデータ変更ステートメントがあるかどうかを確認する方法はありますか?つまりコミットがノーオペレーションかどうか、そしてロールバックが何かを破棄するかどうか

同じことについてOracleの v $ transaction が指摘されているのを見てきました(このSO質問)。 PostgreSQLでの使用に似たものを探しています。

役に立ちましたか?

解決

システムビューpg_locksにチェックインすることから始めます。

http://www.postgresql.org/docs/ 8.4 / interactive / view-pg-locks.html

他のヒント

次の一連のステートメントを検討してください。

select txid_current();

begin;

select txid_current();

2つの選択によって返されたトランザクションIDが等しい場合、開いているトランザクションがあります。そうでない場合はありませんでした(しかし、今はあります)。

数字が異なる場合、副作用として、トランザクションを開いたばかりで、おそらく閉じたいでしょう。

更新:実際、@ r2evansが指摘しているように(洞察に感謝!)、「開始」は不要です。 -txid_current()は、トランザクションを実行している場合に同じ番号を返します。

いいえ、データベースレベルからではありません。おそらく、追跡するためにsqlalchemyレベルでいくつかのトレースを追加できますか?

また、ノーオペレーションをどのように定義しますか?値を以前と同じ値に更新した場合、何もしないのですか?データベースの観点からは、データベースが存在する場合、何もしません。しかし、アプリケーションの観点からは、おそらくそうなります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top