Transaction & Isolation Level

Ba module tương tác: (1) chọn isolation level và xem anomaly nào xảy ra giữa 2 transaction đồng thời; (2) deadlock visualizer — lock ngược thứ tự và cách fix; (3) optimistic vs pessimistic lock chạy song song.

1. Isolation Level Explorer

Cùng một interleaving: T1 đọc số dư A hai lần; ở giữa, T2 cập nhật A và commit. Đổi isolation level rồi bấm Chạy để xem lần đọc thứ 2 của T1 ra gì — và anomaly nào xuất hiện.

T1 (transaction đọc)
SELECT bal A → ?
SELECT bal A → ?
T2 (transaction ghi)
UPDATE A bal=200 (chưa commit)
COMMIT
Chọn level và bấm Chạy.
LevelDirtyNon-repeatablePhantom
Read Uncommittedcho phépcho phépcho phép
Read Committedchặncho phépcho phép
Repeatable Readchặnchặncho phép*
Serializablechặnchặnchặn

* Postgres RR (snapshot MVCC) thực tế cũng chặn phantom — nghiêm ngặt hơn chuẩn SQL.

2. Deadlock Visualizer

T1 chuyển A→B, T2 chuyển B→A, cả hai dùng FOR UPDATE. Nếu khóa theo thứ tự tham số → có thể khóa chéo → deadlock. Bật Lock ordering để luôn khóa id nhỏ trước → hết deadlock.

T1: chuyển A → B

BEGIN
lock A FOR UPDATE
lock B FOR UPDATE
UPDATE + COMMIT
A
B

T2: chuyển B → A

BEGIN
lock B FOR UPDATE
lock A FOR UPDATE
UPDATE + COMMIT
Bấm Chạy để mô phỏng.

3. Optimistic vs Pessimistic Lock

Hai transaction cùng muốn ghi 1 row. Bên trái: Pessimistic (FOR UPDATE) — T2 phải đợi T1 nhả lock. Bên phải: Optimistic (version column) — cả hai chạy song song, T2 phát hiện conflict lúc ghi rồi retry.

Pessimistic (FOR UPDATE)

Khóa trước, ai tới sau phải đợi. An toàn, nhưng giữ lock.
T1
lock row
T1
read+write
T1
COMMIT (nhả lock)
T2
⏳ đợi lock...
T2
lock row
T2
read+write+COMMIT

Optimistic (version)

Không khóa. Check version lúc ghi; conflict thì retry.
T1
read v=7
T2
read v=7
T1
UPDATE WHERE v=7 ✓ (v→8)
T2
UPDATE WHERE v=7 ✗ conflict
T2
re-read v=8
T2
UPDATE WHERE v=8 ✓ (v→9)