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

Khóa hàng, bảng và advisory trong PostgreSQL: ai chặn ai, đo bằng đồng hồ

PostgreSQL có ba tầng khóa: khóa hàng (FOR UPDATE) chỉ chặn cùng hàng, khóa bảng 8 mức mà ACCESS EXCLUSIVE của DDL chặn cả SELECT, và advisory lock do ứng dụng tự định nghĩa. Đo thật bằng hai session đồng thời: cùng đối tượng chờ 3 giây, đối tượng khác chạy ngay. Vì sao một ALTER TABLE có thể treo cả ứng dụng. PostgreSQL 16.

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

Đọc pg_locks để tìm khóa chờ: ai đang chặn ai, đo trên sự cố thật

Khi một truy vấn treo vì khóa, pg_locks và pg_blocking_pids cho biết chính xác PID nào chặn PID nào. Đo trên sự cố thật: pg_blocking_pids trả về kẻ chặn, cây chặn hiện truy vấn bị chặn lẫn kẻ chặn kèm thời gian chờ, và pg_locks thô cho thấy granted=false của kẻ đang chờ. Cách gỡ bằng pg_cancel_backend. PostgreSQL 16.

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.

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

Isolation level trong PostgreSQL: ba mức cô lập và cái giá hiệu năng của chúng

PostgreSQL có ba mức cô lập giao dịch: Read Committed thấy dữ liệu mới nhất mỗi câu, Repeatable Read giữ ảnh chụp nhất quán, Serializable đảm bảo như chạy tuần tự. Đo thật hành vi và chi phí: Read Committed đọc lại thấy 200, Repeatable Read vẫn thấy 100; và Serializable chậm hơn ~21%. Vì sao mức cao cần logic thử lại. PostgreSQL 16.

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

Dashboard nhanh lúc vắng, chậm giờ cao điểm: tìm nút thắt dưới tải đồng thời

Một truy vấn chạy 25 mili giây khi test một mình lại thành 266 mili giây khi 32 người cùng mở dashboard. Bài này đo thật sự suy giảm theo số client, chẩn đoán bằng wait_event, và một cách sửa bất ngờ: tắt parallel query giúp nhanh 1,7 lần dưới tải cao. PostgreSQL 16.