PostgreSQL không sửa dòng tại chỗ. Mỗi UPDATE ghi một phiên bản mới của dòng (tuple mới) và đánh dấu phiên bản cũ là hết hiệu lực. DELETE chỉ đánh dấu, không xoá byte ngay.
Mỗi tuple mang hai cột hệ thống:
xmin— id transaction đã tạo ra phiên bản này.xmax— id transaction đã xoá/thay thế nó (0 nếu còn sống).
select xmin, xmax, id, status from orders where id = 7;Khi một transaction đọc bảng, nó có một snapshot (tập transaction đang chạy tại thời điểm bắt đầu câu lệnh hoặc transaction). Một tuple được coi là nhìn thấy được nếu xmin đã commit và nằm trong tầm nhìn của snapshot, còn xmax thì chưa commit hoặc nằm ngoài tầm nhìn.
Hệ quả thực tế:
- Đọc không chặn ghi và ghi không chặn đọc — reader nhìn phiên bản cũ thay vì chờ lock.
- Bảng bị UPDATE nhiều sẽ tích luỹ phiên bản chết → cần VACUUM dọn.
- count(*) phải quét để xác định tuple nào còn nhìn thấy được, nên không có kết quả tức thời như một số DB khác.