Isolation level quyết định transaction có thấy dữ liệu uncommitted của tx khác không.
| Level | Dirty Read | Non-repeatable | Phantom |
|---|---|---|---|
| READ_UNCOMMITTED | ✅ | ✅ | ✅ |
| READ_COMMITTED (default) | ❌ | ✅ | ✅ |
| REPEATABLE_READ | ❌ | ❌ | ✅ |
| SERIALIZABLE | ❌ | ❌ | ❌ |
- Dirty Read: đọc data chưa commit của tx khác.
- Non-repeatable Read: đọc cùng row 2 lần → khác nhau (tx khác update).
- Phantom Read: query lại → số row khác (tx khác insert/delete).
Đặt: @Transactional(isolation = Isolation.REPEATABLE_READ).
Thực tế: READ_COMMITTED hợp 90%+ (Postgres default); REPEATABLE_READ khi đọc cùng data nhiều lần trong tx (tổng, report); SERIALIZABLE chỉ khi tuyệt đối không chấp nhận phantom (financial ledger). Isolation phụ thuộc DB — không phải DB nào cũng đủ 4 level.