1

顧客情報を編集するためのUIの例を見てみましょう。ユーザーは5つのフィールドを編集し、「送信」を押します。私たちは優れた抽象主義者であるため、5つのフィールドを編集して、それらを異なるコマンドにしました(特定のフィールドへの編集を説明します)。

コマンドハンドラーは、NHibernateなどのツールで永続化されるオブジェクトにプロパティを設定することになります。そのため、データベースに対してUPDATEを実行することになります。

私の主な質問は、データベースのパフォーマンスの観点から、単一のUPDATEステートメントを発行する方が理にかなっているのでしょうか、それとも5つの異なるUPDATEステートメントを発行しても大丈夫ですか?

コマンドハンドラーがトランザクションの境界であるという考えが好きです。動作してトランザクションがコミットされるか、動作せずにトランザクションがロールバックされます(そして、再試行するために再キューイングされる可能性があります)。各コマンドの成功または失敗は、他のコマンドから独立しています。

もう1つのアプローチは、これらのコマンドの処理を単一のデータベーストランザクションにラップすることです。これにより、NHibernateがフラッシュを決定したときに、単一のUPDATEを送信することになります。しかし、これにより、コマンドの処理がオールオアナッシングタイプになり、必ずしも非同期で実行できるとは限りません。

しかし、すべてのコマンドが正しく実行されていることを確認し、失敗した場合は完全にロールバックしたい場合はどうでしょうか。たぶん、多くの小さなトランザクションを含む単一の分散トランザクションがありますか?これにより、データベースの競合が発生し、デッドロックのリスクが高まり、処理が遅くなります(デッドロックのリスクがさらに高まります)。しかし同時に、一貫性が重要です。これは、可用性と一貫性の間のトレードオフだと思います(CAPを参照)。

4

1 に答える 1

4

データベースの観点からは、ほとんどの場合、単一の更新を発行する方が適切ですが、それが本当に重要かどうかはコンテキストによって異なります。

ただし、「優れた抽象化主義者」として、5つのフィールドが編集されたときに5つのコマンドを発行する必要があるかどうかはわかりません。DDDで本当に実行したいのは、ユーザーがUIを介して実行している論理操作ごとに1つのコマンドを発行することです。通常、これは操作ごとに1つだけですが、より複雑なシナリオでは複数になる場合があります。簡単な例を挙げると、誰かが自分の住所を更新している場合、フィールドごとに1つのコマンドはありません。つまり、住所を更新するためのコマンドがあります。

粒度の最低レベルはコマンドになるため、コマンドハンドラーにあるものはすべてトランザクションでラップする必要があります。私たちが行うことは、コマンドを作業単位に入れることです。そのため、複数のコマンドを発行すると、すべてが成功するか、すべてが失敗します。最後に、トランザクションをコミットします。つまり、変更されたオブジェクト(イベントソーシングを使用しているため、集約ルートとイベント)が永続化されます。これを行うためにNHibernateを使用している場合、それは潜在的に1つの操作を実行します-もちろん、それは永続性で実行していることによるものです。

于 2010-07-16T08:31:26.780 に答える