Open1

クリーンアーキテクチャ上でトランザクションをどう実現するか

shimakaze_softshimakaze_soft

整合性を保つために、2つのテーブルに対して保存・更新を行いたいときは、トランザクションを貼ることになるが、クリーンアーキテクチャでいうアプリケーション層に対してデーターベース・トランザクションを記述してしまうと、アプリケーション層に特定の技術基盤のコード(RDB)の責務があるコードを実装してしまうことになる。

解決方法

  • 割り切ってアプリケーション層に実装する
  • AOP(アスペクト指向プログラミング)を使う
  • UnitOfWorkを使用する

割り切ってアプリケーション層に実装する

ビジネス上も整合性というのは非常に大きな概念であり高次元の概念ではあるため、詳細な処理は確かに低次元になるものの、ビジネスロジックの整合性担保のために、トランザクションの開始と終了を主張しても良い。」

上記のように割り切って考える。

AOPを使う

https://camp.trainocate.co.jp/magazine/whats-aop-programming/

pythonで言うなら要はデコレータのことになる

UnitOfWorkを使用する

一番有効そうな手法。

https://medium.com/craftsmenltd/sqlalchemy-and-the-unit-of-work-pattern-dfa91a098023

https://dev.to/shanenullain/decoupling-python-code-implementing-the-unit-of-work-and-repository-pattern-43kf

https://www.cosmicpython.com/book/chapter_06_uow.html

コンテキストマネージャーの考え方が重要になる。

https://it-engineer-info.com/language/python/4472/

「トランザクションによる防衛」の項目

https://iwasiman.hatenablog.com/entry/20220221-ddd-book-2#Chapter-10データの整合性を保つ