【问题标题】:Unable to recover from optimistic locking failure无法从乐观锁定失败中恢复
【发布时间】:2015-03-25 00:39:59
【问题描述】:

我正在从我的模型中删除所有对象,除了用户与之交互的某些对象。

删除后,我从 JSON 中获取那些保存的对象并更新它们的信息,当我保存 managedContext 时,应用程序崩溃并打印“无法从乐观锁定失败中恢复”。

我一直在寻找,但我没有找到任何有关此消息含义的信息,有什么想法吗?

谢谢。

【问题讨论】:

    标签: ios objective-c core-data


    【解决方案1】:

    Google 的第一个结果,来自 Apple 的文档。 (你到底在哪里“寻找”?)

    问题:您看到错误消息“无法合并更改”。

    原因:两个不同的托管对象上下文试图更改相同的数据。这也称为乐观锁定失败

    补救措施:在上下文中设置合并策略,或手动(以编程方式)解决故障。您可以使用committedValuesForKeys: 检索对象当前提交的值,并且可以使用refreshObject:mergeChanges: 重新对对象进行故障处理(以便在下次访问时从其持久存储中检索其数据值)。

    即使错误消息不同,这听起来很像您的情况,因为您很可能有多个上下文试图修改相同的对象。
    尝试将合并策略设置为NSMergeByPropertyObjectTrumpMergePolicyType

    【讨论】:

    • 就是这样,我没有 2 个托管上下文,而且我已经设置了策略 'NSMergeByPropertyObjectTrumpMergePolicy'
    • 也许您在处理 JSON 信息的例程中访问要 update 的对象。这可能在另一个线程中 - 因此您可能应该创建一个子上下文来处理更新,然后推送到父上下文。从概念上讲,它仍然是同样的问题。
    • 谢谢,我试试看。
    • 同样的事情!还是不行。 @subharb 你有没有让它以某种方式工作?
    【解决方案2】:

    由于尝试保存违反数据库唯一性约束的模型而出现此错误。以下 sql 在一个上下文中/使用一个上下文执行多次 (1005),直到它失败并显示“CoreData:错误:致命:无法从乐观锁定失败中恢复”。留言:

    2016-08-10 23:20:50.613 DtLoad[49506:78762894] CoreData: sql: INSERT INTO ZSAMPLE(Z_PK, Z_ENT, Z_OPT, ZR, ZUSER, ZW) VALUES(?, ?, ?, ?, ?, ?)
    2016-08-10 23:20:50.613 DtLoad[49506:78762894] CoreData: sql: ROLLBACK
    2016-08-10 23:20:50.613 DtLoad[49506:78762894] CoreData: sql: BEGIN EXCLUSIVE
    

    XCode 版本 7.3.1

    【讨论】:

      【解决方案3】:

      如果您尽职尽责地设置了合并策略,但仍然收到此错误,则可能是您正在测试损坏的 Core Data SQLite 存储

      我的应用有一些代码来检查不一致之处,例如对象图中的孤立对象。为了测试这段代码,我使用 sqlite 编辑器编辑了一个 Core Data SQLite 存储,添加了一个孤立对象。但是我忽略了将 Z_OPT 列中的值从其默认值 0 更改。嗯,根据 astute reverse engineer,Z_OPT 表示对象已更改的次数,从 1 开始最初添加到数据库时。因此 0 是一个非法值,Core Data 的反应是声明一个乐观锁定失败。将该值更改为 1 即可解决此问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-11-17
        • 1970-01-01
        • 2011-05-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-12
        相关资源
        最近更新 更多