トランザクションを扱う
LT;DR
一般的に「1 つの集約 = 1 つのトランザクション」だが、場合によっては複数の集約を更新しなければならないケースも hr.icon
しかし、複数の集約を更新しなければならないケースもある
e.g. 2 つの口座間の送金
1. データストアがトランザクションが利用可能なケース
e.g. 普通の RDBMS を利用している場合など API からトランザクションを張る
code:fsharp
let connection = new SqlConnection()
let transaction = connection.BeginTransaction()
markAsFullyPaid connection invoiceId
markPaymentComplete connection paymentId
transaction.Commit()
DBMS によっては、複数の操作を 1 回の呼び出しにまとめないとトランザクションできないこともあるっぽい… radish-miyazaki.icon は見たことない…
2. データストアがトランザクションを利用できないケース
e.g. 異なる RDBMS を使っているケース、外部サービスを利用している場合など e.g.
code:fsharp
markAsFullyPaid connection invoiceId
let result = markPaymentComplete connection paymentId
match result with
| Error err ->
// エラーを補償する
unmarkAsFullyPaid connection invoiceId
| Ok _ -> ...