スナップショット
2007/03/30 (Fri) 22:07:46 JST
整合性を管理するもう一つの仕組みはスナップショットです。 スナップショットはデータ行を辞書オブジェクトにしたもので、データ行のすべての属性値を持ちます。 オブジェクトとスナップショットは1対1で対応しています。
オブジェクトグラフと同じく、スナップショットもグローバルID(?KeyGlobalID)とセットで管理されます。 ただし、オブジェクトグラフとは異なるコンテキストレイヤーで管理されます。 オブジェクトグラフは編集コンテキストとオブジェクトの関係を管理し、スナップショットはデータベースとオブジェクトの関係を管理すると言えるでしょう。
図:オブジェクトグラフとスナップショットの関係
グローバルスナップショットとローカルスナップショット
さらにスナップショットは2段階に分けて管理されます。 一つはEODatabaseで管理されるグローバルスナップショット、もう一つはEODatabaseContextで管理されるローカルスナップショットです。
各スナップショットは常に同期しており、最新の状態に保たれます。 EOEditingContextで行うデータベース操作は最終的にEODatabaseContextが実行します。 この過程でスナップショットに変更があればEODatabaseに反映され、さらに他のEODatabaseContextと同期します。
EODatabaseはすべてのスナップショットを保管し、EODatabaseContextは自分が扱うオブジェクトのスナップショットのみを保管します。 EODatabaseが仮想のデータベースとなり、EODatabaseContextがそのトランザクションを管理するようなイメージです。
スナップショットが使われる処理
スナップショットは以下の処理で使用されます。
- データのフェッチ
- オブジェクトの保存
- オブジェクトの初期化
データのフェッチ
EODatabaseContextは、データ行のフェッチ時にスナップショットを作成します。 続いて自身の保管するスナップショットを確認し、同じスナップショットが登録されていなければ、EODatabaseContextとEODatabaseにスナップショットを登録します。 もし登録されていれば他のEODatabaseContextとスナップショットの同期を行います。
オブジェクトの保存
更新の競合を検出するのに使われます。 オプティミスティックロックでは他インスタンスやアプリケーションからデータベースへの変更があったかどうかをスナップショットと比較します。
オブジェクトの初期化
フェッチ後にデータ行からオブジェクトを生成するとき、値を初期化するのにスナップショットが使われます。
Inverse Pages: EOALCommunicateDB EOALDatabaseLevel EOClassMultiplicity EOContextLayers EODelegateFetching EODelegateModel EODelegateObjectStore EOIFConclusion EOIFGenerateGlobalIDs EOIFGenerateObjects EOIFGenerateSnapshots EOIFQueryDB フェッチの舞台裏 EOOLConflict EOOLProcess EOOLUsingInSameInstance EOOLWhenUpdateConflict オブジェクトグラフ アプリケーションインスタンスのロック オブジェクトのロック WebObjects基礎研究室