デッドロックと 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」で覚えます。ブラウザの中のシミュレーターで、本物と同じように打って確かめられます。

すべてのレベルが、プラチナ以上のプランで遊べます。

PostgreSQL の障害対応で使う構文一覧へ戻る