Họ đang đo gì
Bạn học thuộc hay đã dùng transaction thật. Người dùng thật biết C là về ràng buộc của bạn, không phải về việc dữ liệu đồng bộ giữa các node.
Trả lời ngắn~30 giây
Atomicity: cả transaction hoặc thành công hết hoặc không có gì. Consistency: transaction đưa cơ sở dữ liệu từ một trạng thái hợp lệ sang một trạng thái hợp lệ khác, hợp lệ theo RÀNG BUỘC bạn khai báo. Isolation: mức độ transaction chạy song song thấy được việc của nhau. Durability: đã commit thì mất điện vẫn còn. Chữ C hay bị nhầm với C trong CAP — hai thứ hoàn toàn khác nhau.
Giải thích sâu
Consistency trong ACID gần như là chữ ăn theo: nó chỉ nói rằng nếu bạn khai báo khoá ngoại, CHECK và UNIQUE, thì engine không cho một transaction commit ở trạng thái vi phạm chúng. Nghĩa là phần lớn “tính nhất quán” nằm ở chỗ bạn có khai báo ràng buộc hay không. Một hệ thống để mọi kiểm tra trong tầng ứng dụng thì gần như không có chữ C, dù engine hỗ trợ đủ.
Consistency trong CAP thì hoàn toàn khác: nó nói mọi node trả về cùng một câu trả lời cho cùng một thời điểm — gần với linearizability. Nhầm hai chữ này khiến người ta nói những câu vô nghĩa kiểu “Postgres là CP nên nó có ACID”. Nói rõ được sự khác biệt là một trong những cách rẻ nhất để ghi điểm ở vòng senior.
Durability cũng có nhiều tầng hơn vẻ ngoài. Postgres commit là ghi WAL rồi fsync; nếu bạn đặt synchronous_commit = off thì bạn vừa đổi độ bền lấy độ trễ, và một lần mất điện có thể nuốt vài trăm mili giây giao dịch cuối. Đây là lựa chọn hợp lý cho log, và là lựa chọn tệ cho thanh toán.
Câu hỏi tiếp theo họ sẽ hỏi
?Atomicity được cài đặt bằng cách nào?
Qua write-ahead log: mọi thay đổi được ghi vào WAL trước khi chạm dữ liệu, nên khi khởi động lại engine có thể replay phần đã commit và bỏ phần chưa. MySQL/InnoDB thêm undo log để rollback và để dựng ảnh chụp cho MVCC.
?Transaction có tự động rollback khi ứng dụng chết giữa chừng không?
Có, khi kết nối bị đóng thì transaction chưa commit bị huỷ. Nhưng nếu tiến trình chết mà TCP chưa kịp đóng, hàng vẫn bị khoá cho tới khi hết timeout — nguyên nhân rất phổ biến của những đợt treo bí ẩn. Đặt idle_in_transaction_session_timeout là cách chặn.
Trả lời thế này là mất điểm
- Giải thích chữ C bằng “dữ liệu giống nhau ở mọi bản sao”. Đó là CAP, không phải ACID.
- Nói NoSQL “không có ACID”. Nhiều hệ hiện đại có transaction ACID trong phạm vi tài liệu hoặc partition; câu đúng là phạm vi khác nhau, không phải có hay không.
Nguồn
- PostgreSQL — Reliability and the Write-Ahead Log
- Martin Kleppmann, Designing Data-Intensive Applications, ch. 7 — “the C in ACID is not a property of the database”