What are advisory locks vs regular locks in PostgreSQL?

Answer

Regular (object) locks are automatically acquired by PostgreSQL when accessing tables, rows, or system objects — they protect internal data structures and enforce ACID properties. Types include: AccessShareLock (SELECT), RowShareLock (SELECT FOR UPDATE), RowExclusiveLock (INSERT/UPDATE/DELETE), ShareLock (CREATE INDEX), AccessExclusiveLock (ALTER TABLE — blocks all). View held locks: SELECT * FROM pg_locks;. Advisory locks have no inherent meaning to PostgreSQL — they are application-defined semaphores. They don't affect database objects and are managed entirely by application code via pg_advisory_lock(). Regular locks protect data integrity; advisory locks protect application-level invariants like "only one job processor should run at a time." Both are visible in pg_locks (advisory locks have locktype = 'advisory').