デッドロックと log_lock_waits の使い方
にらみ合いを見つける・待ちを記録する
書き方
SHOW deadlock_timeout; ALTER SYSTEM SET log_lock_waits = on; SELECT deadlocks FROM pg_stat_database WHERE datname = 'quest'; \! tail -n 12 log/postgresql.log
2 つのトランザクションが、相手のつかんだ行をお互いに待つと、どちらも進めません(デッドロック)。待ち始めて deadlock_timeout(既定 1 秒)たつと、サーバーが調べ、片方を deadlock detected で取り消します。ログの DETAIL に、だれが・どのトランザクションを・どの SQL で待っていたかが出ます。直し方は、行を書き換える順番を全部の処理でそろえることです。log_lock_waits = on にすると、deadlock_timeout より長く待った文が still waiting for … after … ms としてログに残ります。
例
ALTER SYSTEM SET log_lock_waits = on; SELECT pg_reload_conf(); \! grep 'still waiting' log/postgresql.log
実際に打って練習する
障害対応(PostgreSQL)コースの Lv13「にらみ合い deadlock detected」で覚えます。ブラウザの中のシミュレーターで、本物と同じように打って確かめられます。
すべてのレベルが、プラチナ以上のプランで遊べます。