~/notes/isolation

Isolation

Isolation is the "I" in ACID - it governs how concurrent transactions interact with each other in a database.

Nov 16, 2025

Isolation ensures that concurrent transactions don’t interfere with each other. Each transaction should execute as if it’s the only one running on the database.

Why it matters: Without isolation, system will face problems ike:

  • Dirty reads: reading uncommitted data from another transaction
  • Non repeatable reads: same query returns different results within one transaction
  • Phantom reads: new rows appear between queries in the same transaction

Imagine you have £1000 in your account. Two transactions happen simultaneously:

  • Transaction A: You withdraw £100 at an ATM
  • Transaction B: Your paycheck of £2000 deposits

Without proper isolation, Transaction B might read your balance (£1000) while Transaction A is updating it, leading to lost updates. With isolation, each transaction completes independently.

Isolation levels (from weakest to strongest):

  • Read Uncommitted: No isolation, allows dirty reads
  • Read Committed: Can’t read uncommitted data (most common default), but allows non-repeatable reads
  • Repeatable Read: Same reads return same results, but allows new rows
  • Serializable: Complete isolation, as if transactions ran sequentially
diagram
READ UNCOMMITTED (Dangerous!)READ COMMITTED (Standard)REPEATABLE READ (Session Consistency)SERIALIZABLE (Maximum Safety)

Database: £1000

Transaction A:
START Transfer £800 + LOCK

Transaction B:
Try Transfer £500

B WAITS

A Completes
COMMIT + UNLOCK

B Proceeds

Result:
Sequential execution ✓
No overdraft

Database: £1000

Transaction A: START + Read

A sees £1000

Transaction B:
Deposit £500 + COMMIT

DB now: £1500

Transaction A: Read again

Result:
A still sees £1000 ✓

Database: £1000

Transaction A: START

Transaction A:
Withdraw £100

Transaction A: COMMIT

Updated: £900

Transaction B:
Check Balance

Result:
B sees £900 ✓

Database: £1000

Transaction A: START

Transaction A:
Deposit £2000 (uncommitted)

Transaction B:
Check Balance

Result:
B sees £3000 ✗

Transaction A Rolls Back

Final: £1000
Dirty Read!

READ UNCOMMITTED (Dangerous!)READ COMMITTED (Standard)REPEATABLE READ (Session Consistency)SERIALIZABLE (Maximum Safety)

Database: £1000

Transaction A:
START Transfer £800 + LOCK

Transaction B:
Try Transfer £500

B WAITS

A Completes
COMMIT + UNLOCK

B Proceeds

Result:
Sequential execution ✓
No overdraft

Database: £1000

Transaction A: START + Read

A sees £1000

Transaction B:
Deposit £500 + COMMIT

DB now: £1500

Transaction A: Read again

Result:
A still sees £1000 ✓

Database: £1000

Transaction A: START

Transaction A:
Withdraw £100

Transaction A: COMMIT

Updated: £900

Transaction B:
Check Balance

Result:
B sees £900 ✓

Database: £1000

Transaction A: START

Transaction A:
Deposit £2000 (uncommitted)

Transaction B:
Check Balance

Result:
B sees £3000 ✗

Transaction A Rolls Back

Final: £1000
Dirty Read!

Higher isolation = better consistency but lower performance. Most databases default to Read Committed as a practical middle ground.

Further Reading