Что (если таковые имеются) гарантии ACID могут предоставить Core Data на iOS? - PullRequest
6 голосов
/ 09 июля 2011

Я работаю над приложением, в котором мне нужно сохранять данные надежным способом, то есть обновления должны сохраняться «все или ничего» даже в случае сбоев приложения и выхода и т. Д.

ОднакоЯ не могу найти много информации об уровне устойчивости, которую Core Data может поддерживать, и при осмотре кажется, что возможно повреждение Core Data.Это правильно или Core Data может предоставить свойства ACID высокого и низкого уровня, необходимые для обеспечения надежного хранения данных?

Пожалуйста, уточните, какие API предоставляют эти гарантии - например,сохранение гарантированно фиксирует все обновления или нет, даже если происходит сбой (возможно, в другом потоке) во время сохранения?

1 Ответ

7 голосов
/ 09 июля 2011

ACID применяется только к базам данных , а Core Data не является API-интерфейсом базы данных, поэтому стандарт ACID на самом деле не применяется к Core Data. В лучшем случае ACID применяется только в случае использования постоянного хранилища SQLite и не применяется к двоичным, XML-файлам, хранилищам в памяти или пользовательским атомарным хранилищам.

NSManagedObjectContext обеспечивает выполнение первых трех компонентов ACID: атомарность, согласованность и изоляция. В принципе, вы можете включить функцию ведения журнала SQLite и получить Durability.

ACID был задуман как теоретический стандарт для многопользовательских, железных баз данных. Атомарность, согласованность и изоляция предназначены для предотвращения повреждения базы данных несколькими одновременными пользовательскими транзакциями, наступая друг на друга. Долговечность действительно применима только к системе, в которой иначе практически невозможно выполнить резервное копирование.

Базовые данные, напротив, представляют собой API для реализации уровня модели приложения разработки Model-View-Controller. Это постоянство функции просто необязательно. Он не поддерживает несколько пользователей, а просто несколько подпроцессов одного и того же приложения.

Не существует системы, которая могла бы идеально гарантировать целостность данных в случае аппаратного сбоя. В лучшем случае вы можете гарантировать, что сможете вернуться к более ранней версии данных, но не сможете защитить от аппаратного сбоя во время внесения изменений.

Сказав все это, базовые данные очень надежны. Я видел буквально несколько случаев коррумпированных постоянных магазинов, и обычно только в экстремальных условиях. Я не думаю, что любая другая система, доступная в настоящее время для настольных и мобильных платформ, более надежна.

Обновление:

Пожалуйста, уточните, какие API дать эти гарантии - например, сохранение гарантировано совершить все обновления или нет, даже если сбой происходит (возможно, в другом потоке) во время сохранения? ... Виды сбои, о которых я говорю, это сбои в приложении или выход из приложения - в этом случае желательно, чтобы получалась только последняя транзакция пострадал (то есть потерян, в худшем случае), но я не вижу, как это выразить Базовые данные

Здесь есть две проблемы: операции записи в постоянное хранилище на диск и операции контекста управляемого объекта для поддержания целостности графа объекта и сохранения графа.

Для хранилища SQLite, Сам SQLite совместим с ACID:

Транзакционная база данных является одной в какие все изменения и запросы появляются быть атомным, последовательным, изолированным, и прочный (КИСЛОТНЫЙ). SQLite реализует сериализуемые транзакции, которые атомарный, последовательный, изолированный и прочный, даже если сделка прервано сбоем программы, сбой операционной системы или питание сбой в работе компьютера.

Для других хранилищ, которые записаны как унитарные файлы, Core Data будет использовать методы безопасной записи , которые гарантируют, что существующий исправный файл не будет перезаписан поврежденным файлом.

На более высоком уровне абстракции графа объекта контекст управляемого объекта выполняет проверки перед записью в хранилище и будет отклонять всю попытку записи, если возникнут какие-либо ошибки проверки. (Ожидание ссылки). Такое поведение необходимо для графа объекта ,

Граф объектов - это коллекция связанных живых объектов в памяти. В отличие от процедурной базы данных, где данные кодируются только в полях, отношения между объектами кодируют важные данные. Поэтому весь график должен быть проверен на шаге, а затем сохранен на одном шаге. (Конечно, за кулисами, использующими хранилище sqlite, будут процедурные шаги, совместимые с ACID, но проверка графа объектов происходит до достижения этого уровня.)

Например, у вас есть модель данных для моделирования / симуляции файловой системы.Он имеет две сущности: Folder и File.Каждый объект File имеет обязательную связь с одним объектом Folder, потому что каждый реальный файл всегда находится внутри папки.Однако вы вставляете файловый объект, у которого нет папки.Когда контекст проверяет граф объекта для сохранения, он отклоняет весь граф, потому что граф бессмыслен с файловым объектом, который не находится внутри папки.

...