EOOLWhenUpdateConflict

2007/03/30 (Fri) 22:07:46 JST

いつ更新の競合が生じるのか

オプティミスティックロックはUPDATE文のWHERE句でロックする属性を指定すると書きました。 結局これ以外に競合を検出するような処理は行わないので、EOFが注目するのは「スナップショットとデータベースの関係」であることがわかります。

スナップショットはデータベース操作のたびに最新のデータに入れ替えられ、同時に各オブジェクトグラフ中のオブジェクトもすべて更新されるので、?EditingContext間でスナップショットの差異が出ることはありません。 このようにスナップショットは同一インスタンス内で共有されますから、どの?EditingContextで変更を保存してもUPDATE文のWHERE句の内容は最新のものになります。 したがって、同一インスタンス上では更新の競合は生じない(正確にはEOObjectStoreCoordinatorを共有している限り)ことになります。 EOFのオプティミスティックロックは、他のインスタンスやアプリケーションやで行われたデータベースの変更を検出するものと言えます。

ただし、これはシングルスレッドの場合です。 マルチスレッドでどうなるかは検証していませんが、どのみち保存時にスナップショットがデータ行と同期されるので競合は生じないのではないかと思います。

では具体的にどんなときに更新の競合が生じるのでしょうか。 まず、次のような場合では更新の競合は生じません。

競合が生じるのは次の場合です。


Inverse Pages: オプティミスティックロック