2012-08-16 194 views
2

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

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

千谢谢任何帮助!

回答

1

IOBucketBTree的持久性结构的一部分;它试图减少冲突错误,并尽可能地尝试和解决冲突。

也就是说,冲突并不总是可以避免的,您应该重新开始您的交易。例如,在Zope中,如果提出ConflictError,整个请求将重新运行5次。冲突是ZODB处理两个不同请求试图改变完全相同的数据结构(希望很少)的场合的方式。

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

+0

亲爱的我使用django_zodb,在那里交易很早,我不会拦截它。我昨天发现的是,在更改数据存储之后调用root._p_jar.sync()和transaction.savepoint之后,解决了冲突错误。尽管我没有完全理解这个逻辑。它有意义还是我有点奇怪? – patroqueeet 2012-08-17 06:41:22

+0

另一个问题:所以建立一个能够捕获异常大约5次的loog是有意义的,然后等待几个ms,然后重新执行一个完整的新事务? 如果是这样的话。我记住,我的事务在服务器请求时开始,并在响应呈现时结束。这会过时吗?因此,对于我非常安全的环境来说,复杂交易对zodb来说不是一个好方法?这些交易应该更像ACID? – patroqueeet 2012-08-17 06:44:24

+0

@patroqueeet:'_p_jar.sync()'表示加载最新的数据(这意味着你现在可以使用不一致的状态)。 '保存点'只是一种方法,用于在提交时间之前刷新对磁盘的更改(释放内存)。 – 2012-08-17 06:44:43