2009-06-15 10 views
9

コアデータを使用すると、複数の永続ストアを単一のNSPersistentStoreCoordinator(それぞれ異なる構成を持つ)名に追加することができ、それらをまとめて単一のNSManagedObjectContextにできます。私が見つけられなかったのは、コアデータが複数のストアのセーブ操作のアトミック性をどのように処理するかです。複数のストアを持つコアデータストアアトミック性

のは、私は2つの店舗を持っているとしましょう:

NSPersistentStoreCoordinator *coordinator = [[NSPersistentStoreCoordinator alloc] init]; 
[coordinator addPersistentStoreWithType:type configuration:@"A" URL:aURL options:nil error:NULL]; 
[coordinator addPersistentStoreWithType:type configuration:@"B" URL:bURL options:nil error:NULL]; 

NSManagedObjectContext *context = [[NSManageObjectContext alloc] init]; 
[context setPersistentStoreCoordinator:coordinator]; 

そしてそれは私が保存する時間です:ドキュメントは、イベントのシーケンスが可能になると述べて

NSError *error = nil; 
BOOL result = [context save:&error]; 

  1. ストアA
  2. ストアB

ストアAが正しく保存されても、ストアBが何らかの理由で保存できない場合はどうなりますか?(たとえば、ディスク上のファイルが削除されたか、アクセス許可が読み取り専用になっているなど)。コアデータがストアAへの変更をロールバックするかどうかを詳しく説明するドキュメントは見つかりません。

オブジェクトグラフが矛盾した状態(つまり、1つのストアが更新されている、1つは更新されていない)複数の店舗にまたがって完全なアトミック・セービングを実行するには、多少トリッキーでリソースが集中します。おそらく、おそらくシステムのより多くの経験を持つ誰かから、ここにいくつかの明確化がほしいと思うでしょうか?

答えて

5

最後に今日の回答がCoreDataErrors.hでつまずいた。

NSPersistentStoreIncompleteSaveError    = 134040, // one or more of the stores returned an error during save (stores/objects that failed will be in userInfo) 

したがって、コアデータは成功したストアからセーブをロールバックしようとしません。そして、実際には、複数の店舗全体に原子性を提供することはできません。けっこうだ!

1

これは、あなたの条件を作り直すことによって実験的な答えを得るのが難しくないように思えます。あなたが概説したシナリオを再現する時間がありましたか? 2つのsqlliteストアを作成し、ファイルのそれぞれにデータのセットを書い

  1. は私がすることによってこれを行うだろう。

  2. シャットダウン店
  3. 二sqlliteファイルを削除
  4. が最初の店舗での操作を参照して簡単に書き出す(一つのテーブルへの挿入を行うと、他から削除するのが最善かもしれません)。これを2番目のストアの別の操作と組み合わせて、ファイルが見つからないために失敗するようにします。 5.最初のストアの状態を確認します。

店舗Aへの変更はロールバックされないと私は感じていますが、他の回答に感銘を受けると思います。

+0

私はこれをまだ試していません。実験結果が文書化された行動であると考えることに幾分注意が払われています。行動の変化は私が計画しているものにかなり致命的なものになるためです。 私は、私が検索で出せなかった問題について、誰かが私にドキュメントのスクラップを指し示すことができるかもしれないことを期待していました。 –

+1

まあ、ドキュメントは見つかりません。私は最悪の場合のシナリオを計画し、ロールバックは2つのデータストアではうまくいかず、コードが何らかの方法でこれを処理できることを確認します。大きなトランザクションを開始する前に、ダミーテーブルへの挿入を試みて、ストアの状態が正常であることを確認することができます。 – Grouchal

+0

@Grouchal - あなたが提案しているテストがうまくいくかどうかはわかりません。デフォルトでは、CoreDataは必要に応じて2番目のストアを作成します(提案したとおりにファイルが閉じられた場合)。ファイルが開いていれば、unixファイルシステムはファイルシステムからファイルをリンク解除しますが、CoreDataスタックはクローズされるまでリンクされていないファイルにアクセスできます。 – xyzzycoder

0

複数のデータソース間でトランザクションを達成するための1つのオプションは、「2フェーズコミット」と呼ばれます。「 http://en.wikipedia.org/wiki/Two-phase_commit_protocol

二相システムは、一般企業の発展に見られるコミット、時々

CoreDataが本当にエンタープライズオブジェクト・リレーショナルない http://en.wikipedia.org/wiki/Transaction_processing_monitor

ようタキシード http://en.wikipedia.org/wiki/Tuxedo_(software)などのトランザクション処理システム内に埋め込まれました2フェーズコミットをサポートするには、各永続ストアが両方ともトランザクションである必要がありますナルと原子。

関連する問題