Lập trình 22/09/2026 6 phút

Isolation level: tái hiện thật non-repeatable read và write skew, và vì sao READ COMMITTED không đủ

Transaction chạy đồng thời sinh ra các hiện tượng bất thường mà một mình bạn khó hình dung. Bài này tái hiện THẬT trong PostgreSQL bằng hai session: ở READ COMMITTED, cùng một transaction đọc balance hai lần ra 1000 rồi 500 (non-repeatable read); REPEATABLE READ giữ snapshot ổn định nên đọc lại vẫn 1000; và write skew — hai bác sĩ cùng xin nghỉ trực khiến còn 0 người trực ở REPEATABLE READ, nhưng SERIALIZABLE bắt được và abort một transaction.

Lập trình 22/09/2026 6 phút

Outbox pattern: ghi database và gửi Kafka mà không bao giờ lệch nhau, và vì sao dual-write là cái bẫy

Ghi đơn hàng vào database rồi gửi sự kiện lên Kafka nghe đơn giản, nhưng đó là hai thao tác trên hai hệ thống không có transaction chung — crash ở giữa làm chúng lệch nhau. Bài này đo thật trong pg-lab: outbox pattern ghi cả thay đổi nghiệp vụ lẫn sự kiện trong MỘT transaction (rollback thì cả hai biến mất), rồi relay đẩy 3 dòng outbox thành đúng 3 message trong Kafka. Hiểu vì sao dual-write luôn có khe hở mất đồng bộ.

Lập trình 22/09/2026 6 phút

Transaction và Lua trong Redis: ba cách làm nhiều lệnh nguyên tử, và vì sao Lua mạnh hơn MULTI

Khi nhiều client cùng trừ tồn kho hay cùng trừ tiền, race condition làm hỏng dữ liệu. Redis có ba công cụ đảm bảo nguyên tử. Bài này đo thật trong redis-lab: MULTI/EXEC chạy cả khối lệnh liền nhau; WATCH huỷ transaction khi key bị client khác đổi (bal=999 chứ không phải 949, chứng minh DECRBY bị huỷ); và script Lua trừ tồn kho CHỈ KHI đủ — đọc-kiểm-ghi chạy nguyên tử trong một EVAL, thứ MULTI không làm được vì không rẽ nhánh.

Lập trình 22/09/2026 6 phút

MVCC trong PostgreSQL: vì sao đọc không chặn ghi, và UPDATE không sửa tại chỗ

Nhiều database khóa hàng khi đọc để tránh đọc dở dang — PostgreSQL thì không, nhờ MVCC. Bài này đo thật với hai phiên psql đồng thời: khi phiên A UPDATE balance=999 chưa commit, phiên B vẫn đọc được balance=100 (bản cũ) mà không bị chặn. Xem metadata ẩn xmin/xmax/ctid để hiểu vì sao UPDATE tạo phiên bản mới thay vì sửa tại chỗ.

Lập trình 22/09/2026 6 phút

Bốn mức cô lập giao dịch PostgreSQL: đọc bẩn, đọc lặp sai, phantom — đo thật từng cái

Mức cô lập giao dịch quyết định một giao dịch được thấy gì từ giao dịch khác đang chạy. Bài này đo thật trên pg-lab từng bất thường: ở Read Committed đọc cùng hàng hai lần ra 100 rồi 200 (đọc lặp sai), ở Repeatable Read vẫn 100 (an toàn). Và sự thật ít người biết: PostgreSQL không có đọc bẩn kể cả khi đặt Read Uncommitted.