ZODB中的冲突解决方案

时间:2012-08-16 15:56:23

标签: python django zodb

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

我做了更深入的分析,但仍然不明白为什么它抱怨IOBucket类及其写入的内容。另外,解决它的正确策略是什么?

万分感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

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

也就是说,冲突并不总是可以避免的,你应该重启你的交易。例如,在Zope中,如果引发ConflictError,则整个请求最多重新运行5次。冲突是ZODB处理(希望很少见)两种不同请求试图改变完全相同数据结构的方式。

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