線性一致 (Linearizability)

★★★★★Reviewed

FromDDIADatabase Internals

📚 From the Books

線性一致 (Linearizability)Consistency

最強的單物件一致性保證:讓一個被複製的系統「看起來只有一份資料」。一旦某次讀拿到新值,之後所有的讀都不准再看到舊值。它是 CAP 裡那個與可用性對撞的「C」。

🧠 Intuition

TIP

線性一致 = 「彷彿單副本 + 即時生效」。把每個操作想成在它「真正生效」的某一瞬間原子完成;只要能把所有操作排成一條符合各自起訖時間的全序,且讀總是回傳該序中最近一次寫,就是線性一致。

⚖️ Tradeoffs

線性一致 vs 可序列化 — 兩個不同的軸
  • Linearizability:單物件、強調即時順序(recency),分散式複製層的保證。
  • Serializability:多物件交易、強調等價於某個序列執行,不要求那個序列符合真實時間。
  • 兩者正交:合起來叫 strict serializability(如 Spanner)。SI 兩者都不滿足。
代價 — CAP 與 PACELC
  • 網路分區時,要線性一致就不能同時保有可用性(CAP 的 CP 側):少數派必須拒絕服務。
  • 即使沒分區,跨副本協調(quorum 讀寫、共識)也會增加延遲(PACELC 的 EL/EC 取捨)。
  • 多數系統因此退讓到因果一致——保住「不違反因果」又不必全域協調。
怎麼實作 — 共識是底座
  • 單主 + 同步複製讀走 leader:近似,但 failover/腦裂會破壞。
  • 共識演算法 (Raft / Paxos) 提供的全序廣播是線性一致的標準底座。
  • quorum(w + r > n)本身不足以保證線性一致,需配合讀修復 / 同步等額外手段。

🔑 Takeaways

✍️ My Notes

2026-07-01

  • Q: quorum 讀寫 w + r > n 不是保證讀到最新值嗎,為什麼還不算線性一致?
  • A: w + r > n 只保證讀寫的副本集合有交集,所以讀「至少看得到一份最新寫」。但並發讀之間可能落在不同副本、看到新舊不一的中間狀態,且寫入未完成時的讀可能一次看到新、下一次又看到舊——破壞了「讀到新值後不再回退」的 recency。要補上同步讀修復或讀時 quorum 修復才接近線性一致。

📖 Further Reading

🔗 Dive Deeper