lock_timeout と statement_timeout の使い方
待ちすぎない・長すぎる SQL を止める
書き方
SET lock_timeout = '3s'; SET statement_timeout = '30s'; ALTER ROLE ロール SET statement_timeout = '5min'; ALTER SYSTEM SET lock_timeout = '10s';(全体。ふつうはしない)
lock_timeout は、ロックを取れずに待つ時間の上限です。超えると canceling statement due to lock timeout で、その文だけを取り消します。ALTER TABLE などの DDL は強いロック(AccessExclusiveLock)を待つ間、後から来た読み書きもすべて後ろに並ばせるので、lock_timeout を短く決めてから流し、あきらめたら時間をおいて流し直します。statement_timeout は、1 つの文の時間の上限です(canceling statement due to statement timeout。上限は文を始めたときの設定で決まり、いま動いている文には、あとから決めた値は効きません)。ALTER ROLE … SET で決めると、そのロールの次の接続から効きます。
例
SET lock_timeout = '2s'; ALTER TABLE orders ADD COLUMN memo text; ALTER ROLE report SET statement_timeout = '10min';
実際に打って練習する
障害対応(PostgreSQL)コースの Lv12「行列を作る工事 ALTER TABLE の待ち」で覚えます。ブラウザの中のシミュレーターで、本物と同じように打って確かめられます。
すべてのレベルが、プラチナ以上のプランで遊べます。