一般的にデータの整合性を保つために使われるのがトランザクションである

整合性とは、矛盾がなく一貫性があることを指す

ApplicationServiceは整合性を破綻させる問題が孕んでいる。

  1. ユーザ登録の実行
  2. 重複チェック (名前の重複)
  3. 永続化の依頼(リポジトリへ)
  4. 永続化を処理 ⇦ この処理中に次のユーザ登録が実行

すると、永続化が完了していないため、重複チェックをすり抜けてしまう

S__40886274.jpg

この問題を解決するために、、、

  1. ユニークキー制約による防衛

ユニークキー制約とは、DBの特定のカラムがユニーク、唯一無二であることを保証する機能

これを使えば、名前の重複を探知することができる。

しかし、この機能を使ってしまうと、ユーザを重複させてはいけないという意図をコードから汲み取ることができなくなってしまう。

  1. トランザクションによる防衛

トランザクションスコープを使用すると、コードブロックがトランザクションに参加しているものとして簡単にマークすることができ、トランザクション自体と対話する必要がありません。 トランザクションスコープは、アンビエントトランザクションを自動的に選択して管理することができます。

トランザクションについては別機会に超詳しく調べる予定。