2009-10-30 10 views
14

私は、コミットされていないトランザクションがアクティブなPostgreSQL上にセッション(SQLAlchemy)を持っています。私はちょうどそのセッションをSQL INSERT/UPDATE/DELETEステートメントを介してsqlalchemy.ormを介して発行していないか、または基本接続を介して直接渡すことができました。PostgreSQLトランザクションで保留中の操作を確認する方法

このトランザクションで保留中のデータ変更ステートメントがあるかどうかを確認する方法はありますか?私。コミットがノーオペレーションであろうとなかろうと、ロールバックが何かを捨てるかどうかということですか?

私は、同じことについて人々がv$transactionを指摘しているのを見ました(this SO questionを参照)。私はPostgreSQLで使用するのと同様のものを探しています。

答えて

0

いや、そうでもない、データベースレベルから。おそらく、あなたはそれを追跡するためにsqlalchemyレベルでいくつかのトレースを追加することができますか?

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

select txid_current(); 

begin; 

select txid_current(); 

2つの選択によって返されるトランザクションIDが同じである場合、開いているトランザクションがある:

+0

冗長な書き込みも "ノーオペレーション"になりますが、私はそれを検出したくありません(値よりもコストがかかる)。私は、トランザクションに書き込み/削除操作があるかどうか、つまり効果がないかどうかを知りたいだけです。 –

2

ステートメントの次のシーケンスを考えます。そうでなければ、そうではなかった(しかし今は)。

数字が異なる場合は、副作用としてトランザクションを開いただけで終了することがあります。

UPDATE:@ r2evansは(!洞察力に感謝を)指摘するように実際には、あなたが「開始」する必要はありません - txid_current()は、あなたが取引しているだけであれば、同じ番号を返します。 。

+0

'txid_current();'の2つの連続した2つのクエリが、現在トランザクション中のものと同じ番号を返す場合は、 'begin'は必要ありません。 – r2evans

関連する問題