同時実行の競合をアプリケーション層に伝達する場合、コマンドクエリ分離の原則を尊重する例外を使用する代わりの方法はありますか、それとも例外は(例外をサポートする言語で)私たちが持っている最良のメカニズムですか?
私のアプリケーションの内部には、特定の高レベルのメソッドを呼び出すときに数層下で実行する楽観的ロックロジックがあります(私の場合、カスタムデータアクセス層を使用していますが、確かにオープンですORM実装がこれをどのように行うかを聞く)。アプリケーションが対話する高レベルのメソッド呼び出しは、次のようになります。
// 'data' is just a placeholder for multiple parameters, including something
// that contains row version information
void Customer.UpdateInformation(object data);
他の誰かが作業中のデータを更新したときに、Webアプリケーションのユーザーに通知できるようにする必要があります。
データを変更するメソッドから値を返したくありません。そのため、過去に例外をスローしましたが(.NETデータアダプターAPIは、競合を検出するとDBConcurrencyExceptionをスローします)、同時実行の競合は、常識的な方法では例外ではありません。それらは現実のものです。アプリケーションのワークフローの予測可能で期待される部分です。Eric Lippertの分類法では、それらは外因性の例外として適格ですか?