Database Locks
Types of locks¶
Hussein Nasser: Locks in Postgres
- Table lock
- row lock
Hussein Nasser: Exclusive row lock vs Shared row lock¶
Exclusive lock - others can't read
Shared lock - others can't write
Advisory Locks¶
lock with application defined meaning
- ideal candidate for concurrency control where the standard MVCC doesn't fit the bill
- what is MVCC???
- example: restores: lock that commissions run ID
- prevent another restore from restoring that same commissions run ID at the same time
Session advisory lock¶
- held until
- session ends
- lock is released manually
SELECT pg_advisory_unlock(10);
- avoid session locks????
- A lock acquired in a transaction will hold even if the transaction rollbacks!!!
- Transaction semantics are not honoured for session locks????
SELECT pg_try_advisory_lock(10); -- 64-bit number
SELECT pg_try_advisory_lock(1, 2); -- two 32-bit numbers
Transaction advisory lock¶
- transactional advisory lock acquired in a transaction will be released when the transaction ends
Listing advisory locks¶
Example uses of advisory locks¶
- Restoring a commissions run
- guarantee that there aren't two restores trying to restore the same commissions run
- will mess with the calculations
- guarantee that there aren't two restores trying to restore the same commissions run
- coordinate access to some shared resource or a 3rd party services
- guarantee that only one node can access it at a time
What causes a lock?¶
- DML statement
INSERT INTO table (...) VALUES(...)
UPDATE table SET ... WHERE ...
DELETE FROM table WHERE ...
- DDL statement
CREATE TABLE ...
ALTER TABLE ...
- exclusive lock
- will still allow writes
- (auto) [[PSQL Vacuum]]
- indexing????
- explicitly
BEGIN: LOCK TABLE ... IN MODE
Identifying lock problems¶
- slow queries
- low resource usage
- low I/O usage
Debugging live¶
pg_locks
pg_stat_activity
Hacks o’Clock: Blocked by rdsadmin
Debugging when gathering stats¶
- pgbadger
- make sure you have some extra space
- if you're on RDS
- make sure you're not maxed out on IOPS
- logs and data are on the same device
- ![[image-20221129212634999.png]] ![[image-20221129212803067.png]]
What it doesn't do - For each query, what other query is blocking it? - need to do some live debugging
Common locking problems¶
(auto)vaccum prevents running DDL¶
or DDL prevents autovacuum
How do you know you have this problem¶
????
autovaccum and DDL lock fix¶
- don't disable autovacuum
- [[PSQL Vacuum#Why autovacuum should always be on]]
- Give autovacuum more resources
- so it finishes faster, more often
- split up large tables
- partition or archive
Autovaccum freeze¶
- process name has: "to prevent xid wraparound"
- PSQL has 32 bit transaction IDs
- easy to use them all
- autovacuum has to periodically recycle old IDs
- can't kill it
- will get revived right away
- super important for database
Autovaccum freeze fix¶
- vacuum tuning
- Hacks o’Clock: Blocked by rdsadmin
SELECT ... FOR UPDATE
overuse¶
- blocks writes to those rows
- when someone tries to implement a queue in psql
- don't do that
Idle in Transaction¶
- someone starts a transaction with
BEGIN
- forgets to commit the transaction
Blocks autovacuum
Idle in Transaction fix¶
- find the app code and make sure it calls
COMMIT
idle_in_transaction_session_timeout = 2min
Long DDL Locks¶
fixed in PostgreSQL 11
When you add/alter a column that's - NOT NULL - with a default
Problem - takes an AccessExclusiveLock - rewrites the whole table
Fix (for pre PostgreSQL 11) - see video PostgreSQL Locking issues
Last update:
2023-04-24