我确实在我的 ZODB 上运行并行写入请求。我的 ZODB 中确实有多个 BTree 实例。一旦服务器访问了这样的 BTree 中的相同对象,我就得到了 IOBucket 类的 ConflictError。对于我所有的 Django 基类,我确实设置了 _p_resolveconflict,但无法为 IOBucket 实现它,因为它是基于 C 的类。
我做了更深入的分析,但仍然不明白为什么它会提示 IOBucket 类以及它向其中写入的内容。此外,解决它的正确策略是什么?
非常感谢您的帮助!
请您参考如下方法:
IOBucket 是 BTree 持久化结构的一部分;它的存在是为了尝试减少冲突错误,并且确实会尽可能地尝试解决冲突。
也就是说,冲突并不总是可以避免的,您应该重新开始您的事务。例如,在 Zope 中,如果出现 ConflictError,整个请求最多会重新运行 5 次。冲突是 ZODB 处理两个不同的请求试图更改完全相同的数据结构的情况(希望很少见)的方式。
重新启动您的事务意味着调用 transaction.begin() 并再次应用相同的更改。 .begin() 将获取其他进程所做的任何更改,您的提交将基于新数据。
