這應該是最近資料庫領域中最熱門的話題。

發生了什麼問題?

若依資料庫 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。

參考來源

Call me maybe: MongoDB stale reads