PostgreSQLトランザクションで保留中の操作を確認する方法
-
22-07-2019 - |
質問
アクティブなコミットされていないトランザクションで、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レベルでいくつかのトレースを追加できますか?
また、ノーオペレーションをどのように定義しますか?値を以前と同じ値に更新した場合、何もしないのですか?データベースの観点からは、データベースが存在する場合、何もしません。しかし、アプリケーションの観点からは、おそらくそうなります。