2

ZODBで並列書き込み要求を実行します。BTreeZODB 内に複数のインスタンスがあります。サーバーがそのような 内の同じオブジェクトにアクセスすると、クラスBTreeの が取得されます。私が設定したすべての Django 基本クラスについては、C ベースのクラスであるため、実装できません。ConflictErrorIOBucket_p_resolveconflictIOBucket

IOBucket私はより深い分析を行いましたが、クラスとその書き込み内容について不平を言う理由をまだ理解していません。さらに、それを解決するための正しい戦略は何ですか?

助けてくれてありがとう!

4

1 に答える 1

1

IOBucketの永続構造の一部BTreeです。競合エラーを減らすために存在し、可能な場合は競合を解決しようとします。

とはいえ、競合は常に回避できるわけではなく、トランザクションを再開する必要があります。たとえば、Zope では、 aConflictErrorが発生した場合、リクエスト全体が最大 5 回再実行されます。競合は、2 つの異なる要求がまったく同じデータ構造を変更しようとする (まれであることを願っています) 状況を処理する ZODB の方法です。

transaction.begin()トランザクションを再開するということは、同じ変更を再度呼び出して適用することを意味します。は.begin()他のプロセスによって行われた変更を取得し、コミットは新しいデータに基づいて行われます。

于 2012-08-16T22:37:07.667 に答える