(サイドバーにある同様のタイトルの他の質問は、この問題には対応していません。)
履歴シーケンス ジェネレーターのように使用するコレクションがあります。
{seq_id:1,dt:ISODate(...),type:'service_a',stage:1}
{seq_id:2,dt:ISODate(...),type:'service_a',stage:2}
{seq_id:3,dt:ISODate(...),type:'service_a',stage:3}
{seq_id:1,dt:ISODate(...),type:'service_b',stage:1}
{seq_id:2,dt:ISODate(...),type:'service_b',stage:2}
{seq_id:3,dt:ISODate(...),type:'service_b',stage:3}
私はできるようにしたい:
- 他のすべてのクライアントからコレクションをロックします (書き込みまたは読み取り)
- 最新の seq_id をメモリに読み込む
- メモリ内にさらに 3 つのシーケンス ID を生成します (私の場合は Java)。
- コレクションに 3 つのドキュメントを挿入する
- コレクションのロックを解除
クライアントがステップ 4 に到達する前にステップ 2 と 3 に到達する別のクライアントが競合する seq_ids になるため、クライアントがコレクションをロックしている間、他のすべてのクライアントがコレクションを読み取れないようにロックできるようにしたいと考えています。