0

次のデータ構造があるとします。

{ "name": "i1", "time": 1, "status": 1}
{ "name": "i2", "time": 2, "status": 1}
{ "name": "i3", "time": 3, "status": 1}
{ "name": "i4", "time": 4, "status": 2}

最大の時間と「ステータス」= 1 のアイテムを取得する必要があります。次に、「ステータス」を 2 に更新します。これはすべてアトミックに行われるため、他のコンシューマーが同じアイテムを同時に取得することはできません。

これは rethinkdb で可能ですか?

4

1 に答える 1

1

RethinkDB の原子性はドキュメントごとのレベルでのみ保証されるため、これは部分的にしか可能ではありません。

次のようなことができます。

r.table(...)
  .orderBy(index=r.desc("time"))
  .filter({status: 1})
  .limit(1)
  .update(r.branch(r.row["status"] == 1, {status: 2}, {}), return_changes=True)

内のすべてがupdateアトミックに適用されます。そのため、エントリのステータスが別のクライアントによってすでに 2 に設定されている場合、クエリは {unchanged: 1} を返し、更新が正常に実行されるまで再度実行できます。

ただし、更新が行われた時点で、選択されたドキュメントがまだ最も時間のかかるドキュメントであるとは限りません。このクエリの実行中に、別のクライアントがより長い時間で新しいドキュメントを挿入する可能性があります。これにより、クエリは 2 番目に大きいドキュメントのステータスを 2 に更新します。

これを完全に防ぐには、テーブルに対して明示的なミューテックスまたは読み取り/書き込みロックを使用する必要があります。

于 2015-03-31T23:59:58.093 に答える