同じpostgresqlデータベースにデータを読み取って挿入する複数のワーカープロセスがあります。しかし、時には、何も起こっていないように見えることがあります。あるプロセスの選択または挿入が、別のプロセスの挿入または選択をブロック/ロックする可能性がありますか?
2 に答える
使用しない限り、Postgres でステートメントLOCK TABLE .. EXCLUSIVE
をブロックする方法はありません。SELECT
INSERT
ただし、同じ主キー値を挿入しようとする別のトランザクションによってブロックされる可能性があります。
「何も起こらないように見える」状況が発生した場合pg_stat_activity
は、列を照会してチェックし、waiting
接続がブロックされているかどうかを確認できます。
質問は詳細が不足していますが、そうです、ライターが他のライターをブロックする可能性は十分にあります。複数のワーカーのシナリオでは、これはコードを設計するときに心配する必要があることの1つです。
別のセッションが書き込んだがまだコミットされていない行への書き込みなどの一般的な操作は、デフォルトの分離モードでブロックされます。一意のインデックスを持つテーブルへの挿入も、同じ操作を実行している別のセッションがコミットまたはロールバックされなくなるまでブロックされます。
トランザクションを可能な限り短命にすることで、問題を軽減できる場合があります。大きなテーブルでcount(*)する必要がある場合は、それを行わず、代わりに事前に計算されたカウンターを使用してください(Slow_Countingを参照)。
問題が発生したときにロックを確認するには、Lock_Monitoringのクエリを参照してください。