問題:
2 人の従業員 (A と B) が同時にオフラインになり、顧客 #123、たとえばバージョン #20 を編集している間、オフラインで変更を続けています...
シナリオ:
1 - 2 人の従業員が顧客番号 123 を編集し、1 つ以上の同一の属性を変更します。
2 - 2 人の従業員が顧客番号 123 を編集しますが、同じ変更は行いません (2 人は触れずに互いに交差します)。
...その後、両方がオンラインに戻り、最初に従業員 A が追加され、それによって顧客がバージョン #21 に変更され、次に従業員 B が引き続きバージョン #20 に変更されます
質問:
シナリオ 1 で保持するのは誰の変更ですか?
シナリオ 2 でマージを行うにはどうすればよいですか?
環境:
1 - CQRS + イベント ソーシング スタイル システム
2 - イベント ソーシング データベースをキューとして使用する
3 - 読み取りモデルの結果整合性
4 - RESTful API
EDIT-1:これまでの回答に基づく説明:
きめの細かいマージを実行するには、たとえば、フォームのフィールドごとに 1 つのコマンドが必要ですか?
上記の、ChangeName、ChangeSupplier、ChangeDescription などのきめ細かいコマンドは、それぞれ独自のタイムスタンプを持ち、イベント A と B の両方が ChangedName? を更新した場合に自動マージを可能にします。
編集-2: 特定のイベント ストアの使用に基づくフォローアップ:
イベントストリームの永続化のために @GetEventStore を利用するようです。
次のように、楽観的同時実行性を利用します。
ストリーム内のイベントごとに、ストリーム バージョンが 1 ずつインクリメントされます
書き込みでは、ライターの ES-ExpectedVersion ヘッダーを使用して、期待されるバージョンを指定できます
-1 は、ストリームが存在しないことを指定します
0 以上はストリーム バージョンを指定します
ストリームがそのバージョンにない場合、書き込みは失敗します。期待される新しいバージョン番号で再試行するか、動作を再処理して、必要に応じて問題ないと判断します。
ES-Expected Version が指定されていない場合、楽観的同時実行制御は無効になります
このコンテキストでは、オプティミスティック コンカレンシーはメッセージ ID だけでなく、イベント # にも基づいています。