《同步的運作方式》這篇文章談的是你看得到的部分。這一篇再深入一層,說明每台裝置和伺服器實際上如何處理你的變更。
每項變更都會變成一個操作
當你編輯一則筆記時,你的裝置會一次完成兩件事:把新的文字儲存到本機資料庫,並在佇列裡加入一個操作,也就是一筆小小的紀錄,內容是「這則筆記改了,這是新版本」。建立、編輯、釘選、加標籤、封存和刪除筆記,全都是操作。
在送出佇列之前,你的裝置會先整理一番。對同一則筆記的十次快速編輯會併成一次。如果你一邊輸入一邊釘選這則筆記,釘選和新文字會合併成單一操作,兩邊的變更都不會遺失。只有佇列的順序才算數:較晚的變更永遠勝過較早的變更,不管裝置上的時鐘怎麼說。
一個操作要等伺服器確認後才會離開佇列。如果連線中途斷掉,或你在同步途中關掉 App,佇列下次依然還在,什麼都不會遺失。
先推送,再拉取
同步就是和伺服器之間的兩段簡單對話:
- 推送。 你的裝置把佇列中的操作分批送出。伺服器逐一套用,並把每一個寫進你帳號的變更紀錄,替每筆紀錄依序編上下一個號碼。
- 拉取。 你的裝置會問:「1,234 號之後有什麼變動?」伺服器會回傳那個號碼之後的每一筆紀錄,裝置再把它們套用到本機資料庫。
因為每台裝置都記得自己看過的最後一個號碼,所以只會下載新的內容。一台裝置離線多久都沒關係:它會從上次停下的地方精準地接續。
所有會改動你筆記的動作都會經過這份紀錄,包括透過 API 或透過 MCP 接上的 AI 工具所做的變更。這就是為什麼 AI 助理幫你寫的筆記,會像其他筆記一樣出現在你所有的裝置上。
如何抓出衝突
你的裝置送出的每一次編輯,都會附上它看過的這則筆記的最後一個版本。如果伺服器上的副本在那之後有了變動(因為另一台裝置在這段期間編輯過它),伺服器不會覆寫任何內容,而是改為回傳它自己的副本。
接著,你的裝置會嘗試三方合併,也就是版本控制工具所使用的技術。它會比對三段文字:兩台裝置共同的起始版本、你的版本,以及伺服器的版本。如果兩邊的編輯動到的是筆記的不同部分,它會把它們合在一起並送出合併後的結果,你完全不會察覺。只有當兩台裝置改了同樣幾行時,Caliu 才會詢問你要保留哪個版本。請參閱《解決同步衝突》這篇文章。
有些變更永遠不會衝突。釘選、封存和把筆記設為唯讀,都不算是編輯它的文字,所以能和任何變更乾淨地合併。
每台裝置都遵循相同的規則
網頁版、Apple App 和 Android App 分別用三種不同的程式語言撰寫,但它們遵循同一套同步規則。整理佇列的規則在三者上都會對照同一組共用的測試案例進行驗證,所以在一台裝置上做的變更,其他每台裝置都會以相同的方式處理。
沒有帳號時
沒有帳號時,任何內容都不會離開你的裝置。登入之後,裝置上原有的筆記會加入你的帳號,並像其他變更一樣上傳。