資料庫愛好者們正熱烈討論 Turso 的全新多版本並行控制(MVCC)實作,這項技術承諾解決 SQLite 長期存在的單一寫入限制。這項以實驗性標誌發布的技術預覽版,引發了激烈討論:究竟 SQLite 應該突破其原始設計限制持續演進,還是開發者對於高並行工作負載就應該直接使用不同的資料庫?
單一寫入爭論升溫
這場爭論的核心圍繞著 SQLite 的基礎架構。多年來,開發者已經接受 SQLite 一次只允許一個寫入操作,這在寫入密集的應用程式中可能導致令人困擾的 SQLITE_BUSY 錯誤。雖然部分社群成員主張這項限制是 SQLite 嵌入式本質的一部分,但其他人則認為這在現代多核心系統中是不必要的限制。
一位評論者指出了實際影響:>「SQLite 的單一寫入限制是針對每個資料庫,而非每個連線。您可以將 SQLite 表格分片到多個資料庫檔案中,並透過單一連線查詢所有資料庫。」這個變通方案一直是許多開發者的首選解決方案,但在交易安全性和複雜度方面存在顯著妥協。
「如果您使用 WAL 模式,那麼透過 ATTACH 就無法獲得交易安全/ACID 保證。此外,ATTACH 不支援超過 125 個資料庫,因此將分片數量限制在 125 個。」
討論顯示,雖然使用 ATTACH 語句在多個資料庫檔案間進行分片能提供一些緩解,但在使用 WAL 模式時,它無法在所有資料庫間提供真正的 ACID 保證。對於需要一致性多表格交易的應用程式來說,這項限制變得至關重要。
SQLite 自身的演進與競爭方法
有趣的是,SQLite 團隊並未停滯不前。社群成員指出,SQLite 團隊正在開發自己的多寫入模式,其效能將遠超過 BEGIN CONCURRENT。官方 SQLite 時間表顯示了積極的開發活動,僅本月就有七次新提交,這表明兩個專案正透過不同的技術方法朝著相似的目標邁進。
Turso 的 MVCC 實作靈感來自 TokuDB 系統,維護了一個追蹤多個資料列版本的記憶體資料結構。這允許交易以樂觀方式進行,僅在提交時檢查衝突,而不是立即阻塞。這種方法與 SQLite 實驗性的 mvcc_CONCURRENT 不同,後者在頁面層級操作,當不相關的修改恰好在同一資料庫頁面發生時,可能導致不必要的回滾。
SQLite vs. Turso MVCC 方法比較
| 面向 | SQLite 傳統模式 | SQLite 實驗性 mvcc_CONCURRENT | Turso MVCC |
|---|---|---|---|
| 並發模型 | 單一寫入者 | 頁面級衝突檢測 | 行級版本控制 |
| 衝突解決 | 排他鎖定 | 頁面衝突時回滾 | 樂觀並發控制 |
| 性能影響 | SQLITE_BUSY 錯誤 | 可能出現不必要的回滾 | 提交時衝突檢查 |
| 交易安全性 | 完整 ACID | 在多檔案場景中受限 | 維持一致性 |
| 開發狀態 | 生產環境穩定 | 實驗性分支 | 技術預覽 |
![]() |
|---|
| 類 SQL 資料庫的演進,重點介紹 Turso 的並行寫入功能 |
實際應用與使用案例浮現
討論揭示了幾個真實世界場景,其中並行寫入可能改變開發者使用 SQLite 類資料庫的方式。一位開發者分享了他們在資料處理方面的經驗:>「資料集的簡單導入約需 1.31 億次插入。這需要 10 分鐘⋯⋯如果能在半小時內完成會更好。」雖然另一位評論者指出這個特定用例可能無法從並行寫入中受益,但它凸顯了開發者對這些系統的性能要求。
其他討論的應用包括同時處理多個結帳交易的電子商務系統、即時資料擷取管道,以及在交易內執行計算工作的應用程式。能夠在正常資料庫操作同時執行背景聚合任務或機器學習推論,可能顯著擴展 SQLite 在現代應用架構中的實用性。
社群識別的並行寫入使用案例
- 需要平行處理的高流量資料擷取系統
- 在交易中執行運算工作的應用程式
- 處理同時結帳操作的電子商務平台
- 持續資料增強的即時分析
- 直接將事件具體化到資料庫的串流處理系統
- 與正常操作同時運行的背景聚合作業
![]() |
|---|
| SQLite 在不同執行緒數量下批次插入時的寫入吞吐量,突顯單一寫入者模型的影響 |
哲學分歧:演進 vs. 專業化
整個討論背後存在著根本性的緊張關係:SQLite 應該繼續專注於其原始的嵌入式資料庫利基,還是應該演進以與客戶端-伺服器資料庫競爭?有些人強烈主張專業化:>「SQLite 和 Postgres/MySQL/等產品佔據不同的利基市場。如果您需要大規模並行寫入,這不正是 Postgres/MySQL/等的用途嗎?」
其他人則以成功工具演進的例子反駁:>「Linux 最初是為家用電腦設計的,但我們持續在超級電腦上執行它。它運作得很好。工具會演進。」這種觀點認為,資料庫技術應該適應新的使用案例,而不是受制於其原始設計意圖。
這場辯論延伸至技術實作問題,包括關於 Turso 的 MVCC 變更如何在程序間共享,以及它與 SQLite 官方 hctree 開發的比較。一些社群成員對整個努力表示懷疑,想知道試圖讓 SQLite 處理多個並行寫入是否就像改裝小型跑車來拖曳半掛式卡車。
資料庫領域的未來展望
隨著討論持續,很明顯兩種方法都有其優點。SQLite 的保守演進確保了其龐大安裝基礎的穩定性和可靠性,而像 Turso 這樣的專案則探索更積極的創新。社群對技術細節和哲學問題的熱情參與,顯示了開發者對這些基礎設施選擇有多麼重視。
Turso 的並行寫入功能仍然是實驗性的,在 DELETE 操作和記憶體效率方面存在已知限制。然而,這項功能的單純存在——以及它所引發的活躍討論——表明資料庫領域正持續以意想不到的方向演進。這些創新最終是否會讓主流開發者受益,還是將保持專業化解決方案,取決於未來幾個月的技術執行和社群採用情況。
MVCC(多版本並行控制):一種透過維護資料的不同版本(而非一次僅讓單一交易獨佔鎖定),允許多個交易同時存取相同資料的方法。
參考資料:Beyond the Single-Writer Limitation with Turso's Concurrent Writes


