What isolation actually controls
Isolation level decides what a transaction sees of other transactions' in-progress work. Tighter isolation = stronger guarantees + more potential conflicts. Looser isolation = better concurrency + more chances to see weird intermediate states.
The four standard levels
| Level | Dirty read | Non-repeatable read | Phantom read |
|---|---|---|---|
| READ UNCOMMITTED | Possible (not in PG) | Possible | Possible |
| READ COMMITTED (PG default) | No | Possible | Possible |
| REPEATABLE READ | No | No | No (in PG) |
| SERIALIZABLE | No | No | No |
PostgreSQL specifics
READ UNCOMMITTED behaves identically to READ COMMITTED in PostgreSQL — there are no dirty reads. REPEATABLE READ in PostgreSQL prevents phantom reads (it's actually snapshot isolation). SERIALIZABLE adds true serializability via the SSI algorithm — pay for it with potential serialization failures that you must retry in your application.