0

Ektorp(1.3.0)フレームワークを使用してCouchDBデータベースに接続しています。ただし、更新の競合がある場合は問題があります。executeAllOrNothing一括更新の方法を使用してい ます。文書化されているように、このメソッド(および同等のHTTP API _bulk_docs?all_or_nothing":trueは、競合をチェックしません。HTTPAPIドキュメントから:

ただし、ID 0のドキュメントに競合がある場合は、両方のバージョンがデータベースに存在し、ビューに表示されるバージョンを任意に選択できます。?conflicts = trueのGETを使用して、このステータスを確認できます。

また:

この機能に依存するアプリケーションは、競合が解決されるまで、一部のドキュメントが欠落しているか、競合状態にあることを許容できる必要があります。

ただし、メソッドに関するEktorpのjavadocsには、次のように記載されています。

リスト(返される)には、CouchDBから返されたあらゆる種類のエラーコードを持つドキュメントのエントリのみが含まれます。つまり、すべてが正常に完了した場合、リストは空になります。

私はこれが当てはまらないことを発見しました。競合が発生した場合でも、Ektorpは空のリストを返します。失敗した操作のリストを取得する唯一の方法は、executeBulkではなくを使用することでしexecuteAllOrNothingたが、これはトランザクションである必要があるため、これでは不十分です。

executeAllOrNothing呼び出しが成功したかどうか、成功しなかった場合は、どのドキュメントに競合の問題があったかを知る方法はありますか(GET with conflicts=true一度に数千のドキュメントを保存しようとする可能性があるため、各ドキュメントで繰り返し使用する必要はありません)。実用的ではないでしょう)?

4

1 に答える 1

0

あなたが参照したektorpのドキュメントに記載されている動作は、CouchDBの動作ではありません。all_or_nothing:trueCouchDB では、成功オブジェクト ( 、および new ) が配列で返されるだけでokidそれらrevが競合していることはまったく示されません。

したがって、その動作 (その配列から成功したオブジェクトを削除すること) は、ektorp が実行する必要がある (意図されている) ものです。これは ektorp のバグのように思えます。バグを報告する方法については、彼らの github プロジェクトを参照してください。

于 2012-06-27T23:09:51.327 に答える