在 DDD 中,聚合根可以有一个存储库。让我们采用一个Order聚合,它是非持久性对应物OrderRepository和持久性对应物OrderUoW。我们还有ProductVariant聚合,它跟踪订单中产品的库存。它可以有ProductVariantRepository和ProductVariantUoW。
Order 和 ProductVariant 的工作方式是在保留订单之前检查库存。如果有库存,订单将通过调用 OrderUoW.Commit() 进行持久化。是的,接下来会调用 ProductVariantUoW.Commit() 来更新产品的库存。
不幸的是,事情可能会变糟,用户在短时间内购买了相同的产品(将其视为两个用户购买相同产品的网络应用程序)。现在,第二个用户的整个交易应该会因为恢复刚刚创建的订单而失败。我应该调用 OrderUoW 来回滚更改(应该从数据库中删除订单)吗?或者我应该把两个 UoW.Commit() 操作都放在一个事务范围内,所以一个 commit() 失败会回滚更改?或者两个存储库(Order、ProductVariant)都应该只有 UoW 并且只需要一个事务范围?
我可以通过说,在涉及多个存储库的情况下如何处理事务?