質問

現在、PGTAPを使用して、かなり大量のPostgreSQLストアドプロシージャにユニットテストを追加しています。

一部の手順では、行を明示的にロックする操作を実行します。これらのロックは、アプリケーションにとって重要です。

ロックする必要がある行が必要であり、ロックされてはならない行がそうではないことを確認するテストを作成するにはどうすればよいですか?

私が現時点で持っている唯一の「手がかり」はPGROWLOCKS拡張です。これにより、トランザクションが別のトランザクションによってロックされた行をチェックできます。ただし、現在のトランザクションは独自のロックが表示されていないようであるため、2つのトランザクションを同期するために何かを使用する必要があります。私がまったく間違っていない限り、PGTAPを使用してそれを行う方法はありません。

(注:postgresql 9.1を使用)

役に立ちましたか?

解決

問題の行のCTIDを識別し、どのトランザクションが行をロックするかを知っている場合、PageIndpect拡張子を使用してタプル情報フラグとXMAXを見ることができますか?情報フラグは、行がロックされていることを示し、xmaxを保持しているトランザクションIDに設定する必要があります。

他のヒント

ロックする必要がある行が必要であり、ロックされてはならない行がそうではないことを確認するテストを作成するにはどうすればよいですか?

個別のトランスを開き、Nowaitで同じ行をロックして、例外をキャッチしてください。

PostgreSQLには自律的なトランザクションがサポートされていないため、PGTAPテスト内から個別のトランザクションを開くには、に頼る必要があります。 dblink または他の同様の拡張機能。

詩このリンクを見つけました ロバート・ハースは、なぜrowレベルのタプルがpg_locksで追跡されないのかを説明します:

(...)グラントされていないタプルロックはPG_Locksに現れますが、付与されると消えます。 (PostgreSQLは、これを実行しなかった場合、中規模の選択クエリ用の中規模の選択でもロックテーブルスペースを使い果たします。)

一方、ロックの存在をテストしたい理由がよくわかりません - 成功したロックコマンドの後に保証されています。

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