Tôi tự hỏi meme này đến từ đâu. Đầu tiên, không có gì thực sự đảm bảo rằng mọi thứ đều được ghi vào ổ cứng HDD thực tế vì tất cả các lớp bộ nhớ đệm và ngay cả RDBMS truyền thống cũng không cố gắng ghi vào tệp mọi lúc, nếu không thì chúng sẽ không nhanh như vậy, nhưng các chi tiết khác nhau rất nhiều (xem tại ví dụ xả thích ứng trong InnoDB ).
Bạn chỉ nên quan tâm đến lớp đầu tiên về cơ bản là câu hỏi khi cơ sở dữ liệu cố gắng ghi vào đĩa. Bây giờ có lớp bộ nhớ đệm đầu tiên:Thay vì ghi vào các bảng / bộ sưu tập thực tế, nhiều DB (bao gồm cả MongoDB) sử dụng tính năng ghi nhật ký:Ghi vào tệp chỉ phụ thêm sẽ thường xuyên được hợp nhất trở lại vào tệp dữ liệu thực tế. Trong bất cứ điều gì xảy ra và nó là trong nhật ký, bạn vẫn ổn.
Bây giờ câu hỏi đặt ra là bạn có muốn viết nhật ký hay không và làm như thế nào. Trong MongoDB, bạn có thể kiểm soát điều này bằng cách sử dụng ghi lo ngại
, tức là bạn có thể để mã ứng dụng của mình đợi cho đến khi MongoDB ghi vào tạp chí một bài viết cụ thể (hoặc cho tất cả các bài viết). Trong MongoDB, việc chờ cam kết tạp chí mất tối đa 10ms với cấu hình mặc định nếu tạp chí và tệp dữ liệu nằm trên các thiết bị khối khác nhau, 33ms nếu chúng nằm trên cùng một thiết bị khối. journalCommitInternval
cũng có thể được sửa đổi nếu được yêu cầu.
Tôi đã thu thập một số chi tiết trên tạp chí MongoDB trong một câu trả lời khác .
Một lưu ý nhỏ, độ bền không thực sự liên quan nhiều đến các giao dịch. Các giao dịch cung cấp sự cô lập và nhất quán, ví dụ:bạn có thể thay đổi nhiều thứ trong một lần và người đọc được đảm bảo nhận được cái mới hoặc cái cũ, nhưng không phải một số trạng thái ở giữa. Nói cách khác, cơ sở dữ liệu an toàn giao dịch có thể là cơ sở dữ liệu trong bộ nhớ hoàn toàn không ghi vào đĩa.