2016-05-30 13 views
4

node.jsアプリケーションのロード・テストを行っています。ある時点で、私は要求が保留中の状態に達し、ロックされたトランザクションのために私が推測するのが最良です。これは、最後のログ・ステートメントです:ポストグル・トランザクションのロック

SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ; 

そしてpg_lockに私はmodeExclusiveLockで、GRANTED = trueある上記のクエリで4行を持っています。

どこからバグを探し始めますか? このロック要求で、insertupdateの操作が多い場合は、分離レベルをREPEATABLE READにする必要がありますか? このような状況をデバッグ/処理する方法はありますか? ロックをタイムアウトさせるメカニズムはありますか?アプリは簡単に/自動的に解放され、それ以上のリクエストはブロックされません。

(私はツールを直接探しているわけではないので):このような状況を監視して見つけ出すツールはありますか? (私はMuninを使いたいと思っていました)

私はnode4sをExpress 4.13.3で使用しており、3.19.3をPostgres 9.4.1 ORMとして後継しています。 PostgreSQLのトランザクションのロック地獄:)

あなたはロックが起こると、なぜ場所を正確に把握しようと多くの時間を過ごすことができると

+0

あなたはをpg_stat_activityととしてpg_locksを確認しましたか?どのような種類のロックがありますか?そして、postgresのログファイルはどうですか?デッドロックが見えますか? –

+1

@FrankHeikens、私はすでに 'pg_stat_activity'をチェックしていますが、疑わしいものは見当たりませんでしたが、正しくチェックする方法がわからないかもしれません。ロックやログファイルの種類については、すでに私の質問でそれを言及しています。 'GRANTED = true'はデッドロックがないことを意味しますか?正しく確認するにはどうすればよいですか? – kasiacode

+1

@FrankHeikensコメントについて、私はこれも見つけられます:前に見たことのない「エラー:同時更新のためにアクセスをシリアル化できませんでした」。私はアプリが停止しているときにそれを殺すと、ログに「ログ:開いているトランザクションとのクライアント接続での予期しないEOF」が数回現れます。 https://www.postgresql.org/docs/9.4/static/transaction-iso.html#XACT-REPEATABLE-READ根本的な原因:この問題は、コードや要件なしですが、それは既知の問題で何伝えるのは難しい – kasiacode

答えて

1

ようこそ。しかし、状況を解決するのに役立つ可能性はほとんどありません。次のような状況のこの種を解決するための

一般的なレシピは次のとおりです。

  • あなたの取引サイズは、アプリケーションのビジネスロジックで必要とされる最低限にしてください。たとえば、クエリのIOが高価であるため、同じタイプの挿入または更新を複数行のアナログに置き換えることは避けてください。
  • 不要なトランザクションを回避する、つまりデータを変更するクエリを1つだけ実行しながらトランザクションを使用しないでください。
  • トランザクションのロックを決定し、トランザクションの実行時に繰り返し試みるエラー処理を実装します。このようなリピートをログに記録することで、システムの弱点やその再設計方法を理解するのに役立ちます。でも、よく設計システムで最後のステップは、多くの場合、必要となり

、それはあなたを怖がらせてはいけない;)

+0

地獄?どうして?トランザクションはあなたを助けることができます、彼らはあなたを助ける必要があります。しかし、あなたは良いデザインが必要です。 –

+0

ありがとうございます。残念ながら、現在の状況ではそれほど助けにはなりません。私はトランザクションが大いに役立つ@FrankHeikensとして常に考えていました。あなたはPostgresのトランザクションだけが地獄か一般的であることを意味しますか?とにかく、アプリでトランザクションを賢明にデザインする方法についてもっと詳しく読むことは素晴らしいことです。 – kasiacode

+0

@kasiacode私はトランザクションのロックのみを意味しました(自分の答えを修正しました)。 –

0

私は同じ更新ロックを要求して5つのparallell取引を開始したところ、私は似たような状況に遭遇しました最初のものは、ポストグルコールをもっと必要とする作業を続けました。システム全体がデッドロックし、最初のトランザクションはpg_stat_activityのトランザクションでアイドルとしてリストされ、pg_locksで要求したすべてのロックへのアクセスが許可されます。

私は何が起こっていると思いますか。

最初のトランザクションでロックが許可され、クエリが終了しました。この後、ポストグルへの接続が切断されます。

次の4つのトランザクションは、最初のトランザクションで保持されているロックとそれぞれのブロックを開きます。

ブロックされているため、最初のトランザクションが実行され、sequiezlizeに接続がなくなるため、クエリを作成するためにpostgresに接続しようとするとデッドロックが発生します。私は私のsequiezlizeの初期化を変更し、5であること、プールに既定の複数の接続を追加

は、デッドロックが消えます。

私は第5 '接続を使用している誰かわからない、あるいはデフォルトでは、何らかの理由で、4と5はないことを起こる場合は、まだすべてのボックスをチェックするように見えます。

別の解決策は、ロックを求め、それを得ていない、あなたのユースケースに応じて、ときにトランザクションをアボート、PostgresのでNOWAITオプションを使用することです。

は誰か他の人が出会い、同じ問題を取得する場合、それがお役に立てば幸いです。

関連する問題