EOOLWhenUpdateConflict
2007/03/30 (Fri) 22:07:46 JST
いつ更新の競合が生じるのか
オプティミスティックロックはUPDATE文のWHERE句でロックする属性を指定すると書きました。 結局これ以外に競合を検出するような処理は行わないので、EOFが注目するのは「スナップショットとデータベースの関係」であることがわかります。
スナップショットはデータベース操作のたびに最新のデータに入れ替えられ、同時に各オブジェクトグラフ中のオブジェクトもすべて更新されるので、?EditingContext間でスナップショットの差異が出ることはありません。 このようにスナップショットは同一インスタンス内で共有されますから、どの?EditingContextで変更を保存してもUPDATE文のWHERE句の内容は最新のものになります。 したがって、同一インスタンス上では更新の競合は生じない(正確にはEOObjectStoreCoordinatorを共有している限り)ことになります。 EOFのオプティミスティックロックは、他のインスタンスやアプリケーションやで行われたデータベースの変更を検出するものと言えます。
ただし、これはシングルスレッドの場合です。 マルチスレッドでどうなるかは検証していませんが、どのみち保存時にスナップショットがデータ行と同期されるので競合は生じないのではないかと思います。
では具体的にどんなときに更新の競合が生じるのでしょうか。 まず、次のような場合では更新の競合は生じません。
- 1つのEOEditingContextで同じデータを連続して更新する
- 異なるEOEditingContextで同じデータを連続して更新する
- 異なるセッションで同じデータを更新する
競合が生じるのは次の場合です。
- データをフェッチしてから更新するまでの間に、自身のインスタンス以外からデータベース上のデータが変更される
Inverse Pages: オプティミスティックロック