这就是我的想法。当使用像 MongoDB 这样的每个操作都是原子的并且不支持除此之外的事务时,您是否看到此解决方法有任何问题来模拟 2 阶段提交?
transaction_scope:
read message from servicebus - UpdateCustomerAddress
get customer aggregate from docdb, replay events where commited =1
call customer.updateAddress
validates
creates customer address updated event
apply event
event store as uncommitted events
do optimistic concurrency update against docdb pushing uncommitted events (single op to ensure consistency)
publish event to service bus
update docdb set events just published to commited = 1 (again one 1 op - at least in mongodb)
transaction_complete
NServiceBus 或任何从命令处理程序基础结构管理外部事务范围的东西。据我所知,我们应该具有与 2pc 几乎相同的语义——但我觉得我遗漏了一些东西。
最佳答案
A two-phase commit wiki page最近已添加到 mongodb 网站。它描述了 2-PC 算法并讨论了一些失败场景。
关于transactions - 使用 MongoDB 进行两阶段提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2716582/