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
, потому что каждый реальный файл всегда находится внутри папки.Однако вы вставляете файловый объект, у которого нет папки.Когда контекст проверяет граф объекта для сохранения, он отклоняет весь граф, потому что граф бессмыслен с файловым объектом, который не находится внутри папки.