MongoDB 的髒讀及偽讀

若依資料庫 CAP 理論來分,MongoDB 屬於 “CP"。與大家熟知的 PostgreSQL/MySQL 的 "CA” 不一樣,因為 MongoDB 不是 RDBMS 而傾向於 NoSQL。不管 “CP” 或 “CA",其中的 "C” 即 “consistency” (資料一致性)。無論用戶端怎麼讀取,都要能夠正確讀取最新的資料。
但最後附上的【參考來源】文章指出,事實並不如 MongoDB 官方網站中所聲明般,Write consistency 與 Read consistency 能夠達到真的 “consistency"。作者實測中顯示,MongoDB 會發生髒讀 (Dirty read) 及偽讀 (Stale read) 的問題。
髒讀 (Dirty read):當某資料把值從 X 寫為 Y 時,因為異常而事務回滾發生時,該資料應該退回 X 而不是 Y。可是用戶端讀取時卻是 Y。
偽讀 (Stale read):當某資料把值從 X 寫為 Y 時,即使沒有任何異常,用戶端讀取時是 X 而不是 Y。
因此,MongoDB 並不如它宣稱般能夠達到 "CP"。而如果不能做到其中的 "C” 時,很多業務場景就不能用 MongoDB,例如金融業。只要是資料敏感的行業,不管是髒讀或是偽讀,都是天災。

開始點名

於是,外國鄉民就開始點名了。第一個點到的就是 Stripe (金流服務,連 Paypal 創辦人都投資的公司)。Stripe 就是大量 (聽說內部全使用 MongoDB) 使用 MongoDB 的金流公司之一。
另外,被 Facebook 買下的 Parse 也是使用 MongoDB。

參考來源

留言

這個網誌中的熱門文章

Json概述以及python對json的相關操作

Docker容器日誌查看與清理

利用 Keepalived 提供 VIP