0

(Akka を使用して) たまたま非同期である単純な mongo アプリケーションがあります。アクターにメッセージを送信すると、アクターは 3 つのレコードをデータベースに書き込みます。書き込みが行われたことを確認したいので、WriteConcern.SAFE を使用しています (WriteConcern.FSYNC_SAFE も試しました)。

書き込みが行われるように少し待ってから読み取りを行いますが、何も得られません。

したがって、私の書き込みコードは次のようになります。

collection.save( myObj, WriteConcern.SAFE )
println("--1--")
collection.save( myObj, WriteConcern.SAFE )
println("--2--")
collection.save( myObj, WriteConcern.SAFE )
println("--3--")

次に、テスト コード (アクターの外部で別のスレッドで実行) で、見つけたレコードの数を出力します。

println( collection.findAll(...) )

私の出力は次のようになります。

--1--
--2--
--3--
(pauses)
0

実際、データベースを見ると、レコードがありません。 実際にそこにデータが表示され、テストが機能することもあります。非同期コードは扱いにくい場合があり、書き込みが発生する前にテスト コードがヒットする可能性があるため、タイムスタンプを出力して、これらが提示された順序で実行されていることを確認してみました。データはそこにあるはずです。以下のタイムスタンプ付きの出力例:

Saved: brand_1 / dev  1375486024040
Saved: brand_1 / dev2 1375486024156
Saved: brand_1 / dev3 1375486024261
                      1375486026593 0 found

したがって、読み取りが試行される 2 秒前に 3 回の保存が行われたことは明らかです (書き込みを行う必要がありました)。

よりリベラルな WriteConcerns でこの動作が発生する可能性があることは理解していますが、最も安全な 2 つは、先に進む前に書き込みが実際に行われたことを保証すると思いました。

4

1 に答える 1