web-dev-qa-db-ja.com

デッドロックのベストプラクティス

私たちはPostgres 9.3を実行しており、時々デッドロックの問題があります。現在、誰かが気づき、手動でプロセスを終了します。それらが発生したときにこれらに対処するためのベストプラクティスはありますか? statement_timeoutlock_timeoutdeadlock_timeoutがあることは知っていますが、私が読んだほとんどの場所では、これをpostgres.confファイルに設定したくないと言っています。

このための典型的な/ベストプラクティスの方法があるかどうかを確認したかっただけです。 deadlock_timeoutを10分程度に設定すれば十分のようですが、なぜそれが悪い考えであるかについて、いくつかの重要なものを見落とさないようにしたかったのです。

7
Toolman21

10分は deadlock_timeout極端に高い設定です。これは、なぜあなたが手動で介入してください。デフォルトは1秒で、 マニュアルによると

デフォルトは1秒(1s)です。これは、おそらく実際に必要な最小値です。負荷の高いサーバーでは、サーバーを引き上げることができます。理想的には、設定が通常のトランザクション時間を超えて、ウェイターがデッドロックのチェックを決定する前にロックが解放される可能性を高める必要があります。この設定を変更できるのはスーパーユーザーだけです。

通常のトランザクションが10分を超えることはないと思います。 long実行中のクエリがある場合は、20秒などを試してください。

デッドロックに対する最善の防御策も ここに記載

デッドロックに対する最善の防御策は、データベースを使用するすべてのアプリケーションが複数のオブジェクトのロックを一貫した順序で確実に取得することで、デッドロックを回避することです。

結果としてこれを行う場合、デッドロックの可能性はありません。

5