领域数据库锁定?

时间:2016-05-20 10:27:55

标签: ios swift realm realm-cocoa

在同步时,我用服务器的数据覆盖所有本地数据。为此,我首先为所有对象调用realm.delete(realm.objects(MyObj))。然后我用realm.add(obj, update: false)保存响应的对象。一切都在一次交易中。有效载荷可能需要一段时间来处理,但它不足以证明实施分页的合理性。

用户可以在此过程中正常使用该应用吗?它们是否可以存储在事务的清算部分中删除的新项目,或者在添加部分期间是否会触发错误或被覆盖?如果是,我怎么能避免这个?

1 个答案:

答案 0 :(得分:2)

Realm使用Multi-Version-Concurrency-Control算法。这使用锁来确保独占写入,而其他线程可以继续读取以前版本的数据。我们有一个article on our blog,它解释了它的工作原理。

请注意,您在此尝试解决的问题是一项非常重要的挑战。

  

他们可以存储在交易清算部分删除的新项目,还是会在添加部分期间触发错误或被覆盖?

当后台事务正在进行时,其他写入事务将被阻止。如果从主线程执行这些写操作,则会阻塞主线程。如果从后台线程执行这些操作,它们将排队并在同步事务完成后执行。

在开头删除的对象将无法访问(您可以通过invalidated检查),因为写入事务始终在最新版本上运行。如果您的对象在同步操作中具有一致的主键,则可以利用这些主键重新获取它们并重做对新实例的所有修改。但请注意,在开始写入事务之前,您需要将主键(以及所有其他对象数据)存储到内存中,这意味着隐式刷新。