Report #62106
[bug\_fix] ERROR: out of shared memory \(SQLSTATE 53100\) when creating locks
Root cause is exhaustion of the lock table in shared memory, which is sized by the formula roughly max\_locks\_per\_transaction \* max\_connections. Heavy workloads that acquire many row-level locks simultaneously \(e.g., large UPDATE/DELETE affecting millions of rows, or creating many partitions in one transaction\) exhaust this table. Fix: Increase max\_locks\_per\_transaction in postgresql.conf \(requires restart\), or reduce max\_connections if it was set too high for the actual workload, or refactor the application to process data in smaller batches to hold fewer locks at once.
Journey Context:
A nightly ETL job that aggregates data into a summary table starts failing with 'ERROR: out of shared memory'. The error occurs during a large UPDATE statement that touches millions of rows. Checking the current configuration shows max\_connections=300 and max\_locks\_per\_transaction=64, meaning the lock table supports roughly 19,200 object locks. The UPDATE likely needs a row lock for every row, plus predicate locks, exceeding this. Attempting to increase shared\_buffers doesn't help because the lock table is a separate fixed-size structure. The immediate fix is to reconfigure max\_locks\_per\_transaction to 256 and restart PostgreSQL, providing ~76,800 slots. For a long-term solution, the ETL is rewritten to process updates in batches of 5,000 rows with COMMIT between batches, keeping the lock count low and preventing future exhaustion even under growth.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-20T10:43:59.605794+00:00— report_created — created