Domain driven design 域驱动设计-跨多个有界上下文的原子事务

Domain driven design 域驱动设计-跨多个有界上下文的原子事务,domain-driven-design,Domain Driven Design,在DDD中,我理解事件在相互通信时可以解耦有界上下文。假设一个原子事务在单独的有界上下文A和B上包含两个数据库操作。当A上的操作完成时,它发送一个事件,由B处理,B完成第二个操作。然而,如果B上的操作失败,A上的操作如何回滚 例如,我目前正在使用域驱动设计设计一个系统。它包含一个成员资格和一个清单。为了解耦上下文,我使用事件:当订单被支付时,库存上下文将减少售出产品的数量,并发送一个product\u Seld事件。然后,该事件由成员上下文处理,成员上下文根据售出产品的价格减去用户的余额 但是,

在DDD中,我理解事件在相互通信时可以解耦有界上下文。假设一个原子事务在单独的有界上下文A和B上包含两个数据库操作。当A上的操作完成时,它发送一个事件,由B处理,B完成第二个操作。然而,如果B上的操作失败,A上的操作如何回滚

例如,我目前正在使用域驱动设计设计一个系统。它包含一个成员资格和一个清单。为了解耦上下文,我使用事件:当订单被支付时,库存上下文将减少售出产品的数量,并发送一个product\u Seld事件。然后,该事件由成员上下文处理,成员上下文根据售出产品的价格减去用户的余额


但是,如果用户余额更新由于数据库故障而失败,库存上下文如何知道它,以便它可以回滚以前减少的产品数量?

实际上有一种模式称为Saga


当您使用事件在上下文之间进行通信时,只需发布未售出的产品,并在收到此事件时回滚事务即可


但是,您不能以这种方式提供“原子”事务。这更像是一个长期运行的过程(又称传奇)。如果您确实想要原子性,则需要使用两阶段提交和放弃事件

非常感谢你的建议