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