【DDD】集約とトランザクション境界について調べたことメモ
「データの一貫性の境界」を見極めよう!
簡単まとめシリーズ
今回は 集約とトランザクション境界 について、
自分のわからないところを調べたので、メモとして残しておきます。
集約
集約の説明を『ドメイン駆動設計入門 ボトムアップでわかる! ドメイン駆動設計の基本』
から拝借すると、
「データを変更するための単位として扱われるオブジェクトの集まりを集約といいます」とのこと。
↓ もうすこし具体的に言うと
DDDではエンティティと値オブジェクトというものがありますが、
値オブジェクトを直接触らず、
エンティティ経由でしか変更しないようにするというものですね。
このような制限をかけることで、
ひとまとまりにされたオブジェクト間で維持されるべき不変条件を守ることができます。
トランザクション境界
基本的な考えとしては、集約ごとにトランザクションを貼ります。
↑この基本を守るためにも、理想としては正しいモデリングにより、
正しいトランザクション境界を見つけることが大事です。
正しいトランザクション境界を見つけることは、不用意に大きなDBロックの発生を防止します。
しかしながら、集約をまたいでトランザクション制御したくなるときもあります。
→ 参考例
こういうときにどうするか、上記リンクでもいくつかの方法が挙げられています。
他のサイトも調べてみましたが、だいたい同じような方法が出てきました。
- 結果整合性
- 主流っぽい
- いろいろなサイト、書籍の中で紹介されていました
- 整合性を担保するための仕組みづくりが必要
- 整合性をチェックするためのバッチ など
- 集約をまたいでトランザクションを貼る
- 下記理由のためにあまり推奨されない
- ロック範囲が大きくなってしまう
- 守るべき「データの一貫性の境界」をコード上で表現できなくなる
- 複数の集約をさらにまとめた集約をつくる
- ロック範囲が大きくなってしまうため、あまり推奨されない
結果整合性
結果整合性については、
『ドメイン駆動設計入門 ボトムアップでわかる! ドメイン駆動設計の基本』
の
12章3説「集約の大きさと操作の単位」で言及されているので、もう少しだけ詳しく調べました。
結果整合性とは、最終的に整合性の取れていればOKという考え方。
したがって、整合性が取れていない状況が起こり得るが、それは許容する。
「最終的に整合性を取る」ってどうやるの?
→ こちら
が参考になる。
まとめ
設計周りの話は、唯一無二の答えがあるわけではありません。
よって、今回の話においても「データの一貫性の境界」を意識し、
ちゃんとメリットとデメリットを理解した上で最善の解を選択する必要がありますね。