「同期の仕組み」の記事では、目に見える部分を説明しています。この記事ではもう一段深く、各デバイスとサーバーが変更を実際にどう扱っているかを見ていきます。
すべての変更はオペレーションになる
ノートを編集すると、デバイスは 2 つのことを一度に行います。新しいテキストをローカルのデータベースに保存し、キューに オペレーション を追加します。オペレーションとは、「このノートが変わりました。新しいバージョンはこれです」と伝える小さな記録です。ノートの作成、編集、ピン留め、タグ付け、アーカイブ、削除は、どれもオペレーションです。
キューを送る前に、デバイスはそれを整理します。同じノートへの 10 回のすばやい編集は 1 つにまとめられます。入力中のノートをピン留めした場合は、ピン留めと新しいテキストが 1 つのオペレーションにマージされるので、どちらの変更も失われません。意味を持つのはキューの順序だけです。デバイスの時計がどうであれ、後の変更が常に前の変更に優先します。
オペレーションがキューから消えるのは、サーバーが受け取りを確認したときだけです。途中で接続が切れても、同期中にアプリを閉じても、キューは次回もそのまま残っていて、何も失われません。
プッシュしてから、プル
同期は、サーバーとの 2 つの簡単なやり取りです:
- プッシュ。 デバイスはキューにあるオペレーションをまとめて送ります。サーバーはそれぞれを適用してアカウントの 変更ログ に書き込み、各エントリに連番の次の番号を付けます。
- プル。 デバイスは「1,234 番以降に何が変わりましたか?」と尋ねます。サーバーはその番号より後のログエントリをすべて返し、デバイスはそれをローカルのデータベースに適用します。
どのデバイスも最後に見た番号を覚えているので、ダウンロードするのは新しいものだけです。デバイスがどれだけ長くオフラインだったかは関係ありません。中断したところから正確に追いつきます。
ノートを変えるものはすべて、このログを通ります。API や、MCP でつないだ AI ツールによる変更も同じです。だから AI アシスタントが書いてくれたノートも、ほかのノートと同じようにすべてのデバイスに現れます。
コンフリクトの見つけ方
デバイスが送る編集にはどれも、そのノートについて最後に見たバージョン の記録が付いています。それ以降にサーバー上のコピーが変わっていたら、つまりその間に別のデバイスが編集していたら、サーバーは何も上書きしません。代わりに自分のコピーを返します。
するとデバイスは、バージョン管理ツールが使う手法である 3 ウェイマージ を試みます。比べるのは 3 つのテキストです。両方のデバイスの出発点になったバージョン、あなたのバージョン、そしてサーバーのバージョンです。編集がノートの別々の部分に触れているなら、それらを組み合わせてマージした結果を送るので、あなたが気づくことはありません。両方のデバイスが同じ行を変更したときにだけ、Caliu はどちらのバージョンを残すか尋ねます。「同期のコンフリクトを解決する」の記事をご覧ください。
コンフリクトが決して起こらない変更もあります。ピン留め、アーカイブ、読み取り専用の設定は、テキストの編集とは見なされないので、どんな変更ともきれいにマージされます。
どのデバイスでも同じルール
Web、Apple、Android のアプリは 3 つの異なる言語で書かれていますが、同じ同期ルールに従っています。キューを整理するルールは、3 つすべてで共通のテストケース一式に照らして検証されるので、あるデバイスで行った変更は、ほかのどのデバイスでも同じように扱われます。
アカウントなしの場合
アカウントがなければ、何もデバイスの外に出ることはありません。サインインすると、デバイスにすでにあるノートがアカウントに加わり、ほかの変更と同じようにアップロードされます。