顧客情報を編集するためのUIの例を見てみましょう。ユーザーは5つのフィールドを編集し、「送信」を押します。私たちは優れた抽象主義者であるため、5つのフィールドを編集して、それらを異なるコマンドにしました(特定のフィールドへの編集を説明します)。
コマンドハンドラーは、NHibernateなどのツールで永続化されるオブジェクトにプロパティを設定することになります。そのため、データベースに対してUPDATEを実行することになります。
私の主な質問は、データベースのパフォーマンスの観点から、単一のUPDATEステートメントを発行する方が理にかなっているのでしょうか、それとも5つの異なるUPDATEステートメントを発行しても大丈夫ですか?
コマンドハンドラーがトランザクションの境界であるという考えが好きです。動作してトランザクションがコミットされるか、動作せずにトランザクションがロールバックされます(そして、再試行するために再キューイングされる可能性があります)。各コマンドの成功または失敗は、他のコマンドから独立しています。
もう1つのアプローチは、これらのコマンドの処理を単一のデータベーストランザクションにラップすることです。これにより、NHibernateがフラッシュを決定したときに、単一のUPDATEを送信することになります。しかし、これにより、コマンドの処理がオールオアナッシングタイプになり、必ずしも非同期で実行できるとは限りません。
しかし、すべてのコマンドが正しく実行されていることを確認し、失敗した場合は完全にロールバックしたい場合はどうでしょうか。たぶん、多くの小さなトランザクションを含む単一の分散トランザクションがありますか?これにより、データベースの競合が発生し、デッドロックのリスクが高まり、処理が遅くなります(デッドロックのリスクがさらに高まります)。しかし同時に、一貫性が重要です。これは、可用性と一貫性の間のトレードオフだと思います(CAPを参照)。