宽事务是坏味道 | Szymon Kulec `Scooletz`


如果你能感觉到空气中有难闻的气味,你可以说某些东西已经烂了。同样的规则适用于如果发现需要跨越多个实体的事务才能完成业务操作。您可以将这些实体称为聚合,您可以将它们称为Foo或Bar,但如果事务范围很广,则会遇到麻烦。(banq注:跨多个服务的宽的事务有时是一个伪命题,比如JTA或2PC许诺给你跨多服务多数据库的宽事务,如果进行DDD业务设计,可能就不需要,2PC成了屠龙刀)

对于宽泛事务的坏味道,最重要的一个借口是:

这就是我的业务运作方式

不,不,不。如果你拥有一家面包店,有人前来购买一条面包,不会使用所有的购物车,触摸每一块面包以后才会选择一块,你只会选择其中一块。
如果您拥有一家旅行社并且有人购买旅行行程,您不会致电酒店,航空公司,天气预报员。您只是乐意接受付款,您将为此交易分配一个编号,然后使得一切工作在下面进行。如果飞机出现问题,你可以再租一架等。

这里运行的规则是选择一个负责验证和保持业务操作背后的不变性的单一机构。
有人想买东西吗?只需注册订单并稍后处理产品的缺乏。(banq注:这是中间服务商存在的必要性,根据你的要求提供你所需要的产品和服务,并保证这些产品和服务被你能消费到)

你想从账户转账吗?只需确认源帐户有足够的钱并注册交易。如果没有目的地帐户怎么办?您可以将资金转回源帐户。请求转移不需要目标帐户的存在!

也许你的问题非常独特。也许你不走运,你需要跨越多个实体进行广泛的事务性交易。但是,有一个很大的机会,你可以建模。这很简单。(banq注:这可能属于长时间的流程事务,比如预定位置后付款,可参考工作流建模)