Lập trình 26/10/2026 7 phút

Khoá và mức cô lập đo thật: đọc lại trong REPEATABLE READ vẫn ra 1000 còn READ COMMITTED ra 3000, gap lock chặn chèn vào khe 2035 ms, và một deadlock thật bị InnoDB phá trong tích tắc với lỗi 1213

Phần 7 sê-ri MySQL và InnoDB: mức cô lập quyết định một giao dịch thấy gì, còn khoá quyết định ai phải chờ ai. Đo thật trong mysql:8: cùng một kịch bản, đọc lại trong REPEATABLE READ vẫn ra 1000 (ảnh chụp cả giao dịch) còn READ COMMITTED ra 3000 (ảnh chụp mới mỗi câu). Gap lock của REPEATABLE READ chặn một INSERT vào khe trong khoảng đang bị khoá mất 2035 ms, trong khi READ COMMITTED cho chèn ngay sau 57 ms. Và một deadlock thật — hai giao dịch khoá hai hàng theo thứ tự ngược nhau — bị InnoDB phát hiện tức thì, cuộn lại một nạn nhân với lỗi 1213, đọc được trong SHOW ENGINE INNODB STATUS.

Cơ sở dữ liệu 22/09/2026 5 phút

Deadlock trong PostgreSQL: phát hiện và tránh — kích một cái thật để xem

Deadlock xảy ra khi hai giao dịch giữ khóa mà bên kia cần, theo thứ tự ngược nhau. PostgreSQL tự phát hiện sau deadlock_timeout (1s) và hủy một nạn nhân với lỗi deadlock detected. Kích một deadlock thật để xem lỗi và log đầy đủ, rồi chứng minh khóa cùng thứ tự loại bỏ nó hoàn toàn. Vì sao ứng dụng phải có retry. PostgreSQL 16.

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 7 phút

Kiểm thử mã đồng thời đo thật: -race bắt đua dữ liệu 20/20 nhưng im lặng với đua logic; đua logic và deadlock lộ 0/1000 lần trên 10 CPU, lộ 100/100 khi chèn một điểm nhường CPU; runtime Go không báo deadlock trong go test

Ba lỗi đồng thời khác bản chất trong một gói Go: bộ đếm không mutex, rút tiền kiểm rồi trừ với hai lần khoá riêng, chuyển khoản khoá theo thứ tự tham số. Bộ dò đua bắt lỗi đầu 20/20 và không nhắc một chữ tới Withdraw dù test đó đỏ 5/20 dưới -race. Đua logic đỏ 0/100 và 0/1000 lượt chạy thường, 0/100 trên 1 CPU, 100/100 khi chèn runtime.Gosched vào giữa kiểm và trừ. Với p bằng 26% cần 10 lượt để 95% bắt được; với p bằng 0 không N nào đủ. Deadlock kẹt 0/20 lượt thường, 20/20 với điểm nhường, và runtime Go không báo deadlock trong go test, chỉ -timeout và goroutine dump chỉ ra chỗ kẹt.