I dati principali consentono di aggiungere più archivi persistenti a un singolo nome NSPersistentStoreCoordinator
(ognuno con una configurazione diversa), riunendoli in un unico NSManagedObjectContext
. Quello che non sono stato in grado di scoprire è come Core Data gestisce l'atomicità di un'operazione di salvataggio per più negozi.I dati principali archiviano l'atomicità con più negozi
Diciamo che ho due negozi:
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];
E allora è il momento di salvare dovrei farlo:
NSError *error = nil;
BOOL result = [context save:&error];
La documentazione afferma che la sequenza degli eventi sarà:
- Salva negozio A
- Salva negozio B
Cosa succede se il negozio A viene salvato correttamente, ma il negozio B non può essere salvato per qualche motivo? (ad esempio, il file sul disco è stato cancellato o le autorizzazioni lo hanno reso di sola lettura, quel genere di cose). Non riesco a trovare alcuna documentazione che indichi se i dati core ripristinano o meno le modifiche al negozio A.
Mi sembra strano che il grafico dell'oggetto venga lasciato in uno stato incoerente (cioè un negozio aggiornato, uno non), ma alquanto complicato e con molte risorse per eseguire un salvataggio completamente atomico su più negozi. Mi piacerebbe davvero qualche chiarimento qui, forse da qualcuno con più esperienza del sistema!
Non ho ancora provato questo. Sono piuttosto cauto nel considerare il risultato sperimentale come il comportamento documentato, poiché qualsiasi cambiamento nel comportamento sarebbe abbastanza catastrofico per ciò che sto pianificando! Speravo che qualcuno potesse indicarmi un frammento di documentazione sull'argomento che non ero stato in grado di presentare nelle mie ricerche. –
Beh, non riesco a trovare alcuna documentazione. Pianificerei quindi lo scenario peggiore e ipotizzerei che il rollback non funzionasse su due archivi dati e assicurassi che il codice possa gestirlo in qualche modo. Puoi sempre provare a inserire inserti in tabelle fittizie prima di iniziare la tua grande transazione per assicurarti che lo stato dei negozi sia OK. – Grouchal
@Grouchal - Non sono sicuro che il test che stai proponendo funzionerebbe. Per impostazione predefinita, CoreData creerà il secondo archivio in base alle esigenze (se il file è stato chiuso come suggerito). Se il file fosse aperto, il file system unix scollegerebbe il file dal filesystem, ma lo stack CoreData avrebbe comunque accesso al file non collegato fino a quando non fosse stato chiuso. – xyzzycoder