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