Skip to content

requireIdleInTransactionTimeout

Group safety · Migrations only · Since 0.25.0
Diagnostic lint/requireIdleInTransactionTimeout

Sources: inspired by pgfence/missing-idle-timeout

Description

Dangerous lock statements should be preceded by SET idle_in_transaction_session_timeout.

A transaction holding dangerous locks that goes idle (e.g., due to application errors) will block other operations indefinitely. Setting idle_in_transaction_session_timeout ensures the session is terminated if it sits idle too long.

Examples

Invalid

ALTER TABLE users ADD COLUMN email TEXT;
code-block.sql:1:1 lint/requireIdleInTransactionTimeout ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

  ! Statement takes a dangerous lock without idle_in_transaction_session_timeout set.

  > 1 │ ALTER TABLE users ADD COLUMN email TEXT;
      │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    2 │ 

  i Run SET idle_in_transaction_session_timeout = '...' before this statement to prevent idle transactions from holding locks.

Valid

CREATE INDEX CONCURRENTLY users_email_idx ON users(email);

How to configure

{
  "linter": {
    "rules": {
      "requireIdleInTransactionTimeout": "error"
    }
  }
}

How to suppress

Suppress this diagnostic with a comment:

-- pgls-ignore requireIdleInTransactionTimeout