可以在iOS上提供哪些(如果有的话)ACID保证?

fra*_*yer 6 acid core-data ios

我正在开发一个应用程序,我需要以可靠的方式持久保存数据,即即使在应用程序崩溃和退出等情况下,更新也需要全部或全部保留.

但是,我无法找到有关Core Data能够支持的弹性水平的更多信息,并且从环顾四周看来核心数据损坏似乎是可能的.这是正确的还是Core Data能够提供支持可靠数据存储所需的高级和低级ACID属性?

请具体说明哪些API提供了这些保证 - 例如,即使在保存期间发生崩溃(可能在另一个线程上),保证提交所有更新或保证都没有保存?

Tec*_*Zen 7

ACID仅适用于数据库,Core Data不是数据库API,因此ACID标准并不真正适用于Core Data.最好的ACID仅适用于使用SQLite持久性存储的情况,不适用于二进制,xml,内存或自定义原子存储.

NSManagedObjectContext强制执行前三个ACID组件:原子性,一致性和隔离.您原则上可以打开SQLite的日志记录功能并获得持久性.

ACID被认为是多用户,大型铁数据库的理论标准.原子性,一致性和隔离都旨在通过相互踩踏来防止多个同时发生的用户事务破坏数据库.耐用性实际上仅适用于无法以其他方式实际备份的系统.

相比之下,核心数据是用于实现模型 - 视图 - 控制器设计应用程序的模型层的API.它的持久性功能仅仅是可选的.它不支持多个用户,只支持同一个应用程序的多个子进程.

没有系统可以完美地保证面对硬件故障时的数据完整性.最好的情况是,您可以保证可以恢复到早期版本的数据,但在进行更改时无法防止硬件故障.

说了这么多,Core Data非常强大.我见过一些腐败的持久存储的案例,然后通常只在极端条件下.我不认为目前可用于桌面和移动平台的任何其他系统更可靠.

更新:

请具体说明哪些API提供了这些保证 - 例如保证提交所有更新或保存,即使在保存期间发生崩溃(可能在另一个线程上)?...我所指的失败类型应用程序内的崩溃或应用程序的退出 - 在这种情况下,最好只有最后一个事务受到影响(即丢失,最差),但我不知道如何用Core Data表达这一点

这里有两个值得关注的领域,持久性存储写入磁盘的操作以及托管对象上下文在维护对象图完整性和保存图形方面的操作.

对于SQLite存储,SQLite本身符合ACID:

事务数据库是指所有更改和查询都显示为Atomic,Consistent,Isolated和Durable(ACID)的数据库.即使事务因程序崩溃,操作系统崩溃或计算机电源故障而中断,SQLite也会实现原子,一致,隔离和持久的可序列化事务.

对于作为单一文件写出的其他商店,Core Data将使用安全写入方法,以确保现有的好文件不会被损坏的文件覆盖.

在对象图的较高抽象级别,托管对象上下文在写入存储之前执行验证,并且如果发生任何验证错误将拒绝整个写入尝试.(链接待定.)对象图需要此行为.

对象图是内存中相关活动对象的集合.与过程数据库不同,数据仅在字段中编码,对象之间的关系编码重要数据.因此,必须在步骤中验证整个图形,然后一步保存.(当然,在使用sqlite存储的幕后,会有符合程序ACID的步骤,但是在达到此级别之前会对对象图进行验证.)

例如,您有一个数据模型来建模/模拟文件系统.它有两个实体:FolderFile.每个File对象与单个对象具有必需的关系,Folder因为每个真实文件始终位于文件夹中.但是,您插入没有文件夹的文件对象.当上下文验证对象图形以进行保存时,它将拒绝整个图形,因为该图形是无意义的,文件对象不在文件夹内.