タグ

ブックマーク / www.pospome.work (2)

  • DDDにおいて、なぜ複数の集約にまたがってトランザクションをかけてはいけないのか(multiple aggregates in one transaction) - pospomeのプログラミング日記

    DDDでは 集約 = トランザクション境界 でなければならないので、 複数の集約をまたがるデータの永続化処理は結果整合性になる。 なぜ集約をまたいでトランザクションをかけてはいけないのかというと、 集約で「データの一貫性の境界」を表現するため。 なので、集約同士はデータの一貫性を保証しない = 結果整合性 ということになる。 集約がトランザクション境界ではない場合はどうなるのかというと、「データの一貫性の境界」がドメインレイヤで表現できなくなる。 あるときは 集約A, 集約B が一緒のトランザクションで登録され、 あるときは 集約A, 集約B, 集約C が一緒のトランザクションで登録される、というケースがあると、 「データの一貫性の境界」はアプリケーションレイヤのトランザクション開始から終了までのコードで表現されてしまうので、 それぞれの集約がどの粒度で一貫性を保たれるのかが分からなくなる

    DDDにおいて、なぜ複数の集約にまたがってトランザクションをかけてはいけないのか(multiple aggregates in one transaction) - pospomeのプログラミング日記
    j5ik2o
    j5ik2o 2018/12/03
    よいまとめ
  • DDDにおいてリポジトリとDBのトランザクションは切り離せないのか? - pospomeのプログラミング日記

    DDDではリポジトリに対してDIPを利用し、インターフェースと実装を切り離す傾向にある。 これはいわゆる「抽象に依存せよ」ってやつなので、 DDDというよりは既存のプログラミングテクニックになる。 で、これを実現するためにリポジトリを以下のようにインターフェースで実装する。 コードはTypeScriptです。 interface UserRepo { insert(user: User, master: DbMasterConnection): Promise<User>; findByName(name: string, con: DbConnection): Promise<User>; findById(id: number, con: DbConnection): Promise<User>; }リポジトリの実装自体はインフラレイヤに置く。 「データを取得する」ということなので、個

    DDDにおいてリポジトリとDBのトランザクションは切り離せないのか? - pospomeのプログラミング日記
    j5ik2o
    j5ik2o 2016/04/30
    集約を跨るTx境界があるならCxtなどの抽象化が必要ですが、集約単位=Tx境界とするならリポジトリ内部でコネクションやトランザクションのオブジェクトを取得するのもありです。集約の外側では結果整合になるので。
  • 1