python - ZODB 中的冲突解决

标签 python django zodb

我确实在我的 ZODB 上运行并行写入请求。我的 ZODB 中确实有多个 BTree 实例。一旦服务器访问了这样的 BTree 中的相同对象,我就得到了 IOBucket 类的 ConflictError。对于我所有的 Django 基类,我确实设置了 _p_resolveconflict,但无法为 IOBucket 实现它,因为它是基于 C 的类。

我做了更深入的分析,但仍然不明白为什么它会提示 IOBucket 类以及它向其中写入的内容。此外,解决它的正确策略是什么?

非常感谢您的帮助!

最佳答案

IOBucketBTree 持久化结构的一部分;它的存在是为了尝试减少冲突错误,并且确实会尽可能地尝试解决冲突。

也就是说,冲突并不总是可以避免的,您应该重新开始您的事务。例如,在 Zope 中,如果出现 ConflictError,整个请求最多会重新运行 5 次。冲突是 ZODB 处理两个不同的请求试图更改完全相同的数据结构的情况(希望很少见)的方式。

重新启动您的事务意味着调用 transaction.begin() 并再次应用相同的更改。 .begin() 将获取其他进程所做的任何更改,您的提交将基于新数据。

关于python - ZODB 中的冲突解决,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11991114/

相关文章:

python - 您建议使用哪种 Python 方法来检查 whois 数据库记录?

python - 如何根据另一个数据框列 python 中的值进行 value_counts?

python - python中有没有一个命令可以让你重新执行刚刚执行过的函数?

python - Django 查询集与 distinct 和 exclude 一起

python - Django:如何让表单向导在创建表单时接收请求对象?

python - 如何在ZODB中设置缓存大小?

python - ZODB pool_size的合理设置

Solr 不索引 blob 文件

python - 仅使用一个辅助数组实现合并排序(而不是递归地创建新数组)

python - Django - 无效的过滤漂白剂