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

Serializable và write skew: lỗi đồng thời mà Repeatable Read không bắt được

Có một loại bug đồng thời tinh vi hơn lost update: hai giao dịch đọc chung một điều kiện rồi ghi hai hàng khác nhau, phá vỡ một ràng buộc mà không cái nào tự biết. Bài này đo thật trên pg-lab ví dụ hai bác sĩ cùng xin nghỉ: ở Repeatable Read cả hai thành công và còn 0 người trực (sai), ở Serializable một giao dịch bị hủy với lỗi read/write dependencies và ràng buộc được giữ.

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

Khóa hàng trong PostgreSQL: FOR UPDATE, lock wait, và cách chẩn đoán query bị treo

MVCC giúp đọc không chặn ghi, nhưng khi cần 'đọc rồi chắc chắn ghi' bạn phải khóa hàng tường minh bằng FOR UPDATE. Bài này đo thật trên pg-lab: phiên thứ hai chờ 2.535 ms cho phiên thứ nhất nhả khóa cùng hàng, quan sát pg_locks và wait_event=Lock/transactionid, và NOWAIT báo lỗi ngay thay vì chờ. Hai view vàng để chẩn đoán treo vì khóa.

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

Deadlock trong PostgreSQL: khóa chéo, 'deadlock detected', và cách tránh bằng thứ tự khóa

Hai giao dịch khóa chéo nhau — A giữ hàng 1 xin hàng 2, B giữ hàng 2 xin hàng 1 — là công thức của deadlock. Bài này tạo deadlock thật trên pg-lab: PostgreSQL tự phát hiện vòng chờ và hủy một nạn nhân với ERROR deadlock detected, giao dịch kia đi tiếp. Và cách tránh triệt để: luôn khóa các hàng theo cùng một thứ tự.

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

SKIP LOCKED: xây hàng đợi công việc ngay trong PostgreSQL, 4 worker không đụng nhau

Bạn không phải lúc nào cũng cần RabbitMQ hay SQS cho hàng đợi công việc — PostgreSQL làm được bằng SELECT FOR UPDATE SKIP LOCKED. Bài này đo thật trên pg-lab: 4 worker chạy song song vét sạch 300 job, chia đều 76/75/75/74, mỗi job xử lý đúng một lần, không trùng, không chờ khóa. Kèm advisory lock cho khóa mức ứng dụng.

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

Tổng kết đồng thời PostgreSQL: khung tư duy và checklist tránh bug concurrency

Mười một bài, mười một phép đo thật bằng nhiều phiên psql đồng thời. Bài tổng kết này nối tất cả — MVCC, bốn mức cô lập, lost update, write skew, khóa hàng, deadlock, bloat, vacuum, HOT, WAL, SKIP LOCKED — thành một bảng số liệu và một checklist thực chiến: cần đảm bảo gì thì dùng gì, cạm bẫy đồng thời nào cần tránh, và vì sao mọi thứ bắt nguồn từ MVCC.

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

Chống stampede: singleflight và khoá Redis, đo thật 500 lượt chạm database rút xuống còn 1

Phần trước đo được 500 request cùng miss một key kéo theo đúng 500 truy vấn database và 1128,4ms cho request xấu nhất. Bài này chặn nó bằng hai cách và đo lại cùng kịch bản: singleflight gom lời gọi trùng trong một tiến trình — còn 1 truy vấn, trễ xấu nhất 7,2ms (nhanh hơn 157 lần); khoá Redis SET NX cũng còn 1 truy vấn nhưng chậm hơn chút (13,9ms). Rồi chạy 4 instance để lộ ra khác biệt thật sự: singleflight cho 4 truy vấn, khoá Redis vẫn 1.