今回は、Goldの「パフォーマンスチューニング - 性能に関係するパラメータ(ロック管理)」からの出題です。
deadlock_timeout で指定された時間を経過してもロックが獲得できなければ、デッドロックが発生していると判断される。
deadlock_timeout の値を調整することで、デッドロックの発生を回避できる。
deadlock_timeout の値を小さくすると、ロック待ちのプロセスが減るので、結果的にCPU負荷を小さくすることができると考えられる。
デッドロックはアプリケーションの作り方を工夫することで回避すべきであり、deadlock_timeout の値はなるべく大きくすることが望ましい。
deadlock_timeout のデフォルトの設定では、デッドロックの検出は自動的には実行されない。
※この例題は実際のOSS-DB技術者認定試験とは異なります。
データ更新のトランザクションは、他のトランザクションとの競合によるデータ不整合を防ぐため、更新の前にデータのロックを獲得します。
他のトランザクションがデータを更新中で当該データをロックしているときは、ロックが解放されるまで待ちます。
複数のトランザクションがそれぞれ別のトランザクションがロックしたデータの解放を待ち、どちらも処理を先に進めることができなくなった状態をデッドロックと呼びます。
PostgreSQLにはデッドロックを自動的に検出し、検出した場合はそのうちの1つのトランザクションを強制的に終了させることで、デッドロックを解決する、という機能があります。
deadlock_timeout は、ロック待ちの状態になったときにデッドロックの検出処理を開始するまでの待ち時間を指定します。デフォルト値は 1s、つまり1秒です。
あくまでも、この指定時間の経過後に検出処理を開始する、というだけですから、この場合に必ずしもデッドロックが発生しているとは限りません。
値を小さくすると、デッドロックの検出は早くなりますが、実際にはデッドロックが発生していないのに検出処理が動くということも多くなります。
値を大きくすると、この反対に、無駄なデッドロック検出処理の回数は減りますが、デッドロックが実際に発生したときに、それが検出されるまでに待たされる時間は長くなります。
デッドロックの検出はそれ自体が CPU 負荷の高い処理なので、できる限り実行しないで済むようにすべきです。
デッドロックが頻繁に発生するような環境では、deadlock_timeout を小さくすることで、デッドロックを早く解決できるかもしれませんが、なるべくデッドロックが発生しないようにアプリケーション側で工夫し、CPU 負荷の高いデッドロック検出処理が不必要に実行されないように deadlock_timeout を大きくする、というのが正しいやり方です。
従って、正解は D です。
今回の解説について、理解できないポイントがあればどんどん質問をお寄せ下さい。
※試験問題に関わるお問い合わせにつきましては、LPI-Japan事務局ではお応えできませんのでご了解ください。
© EDUCO All Rights Reserved.