我正在研究DDD和事件源中的编程.
我看到一个例子,当调用域逻辑时(例如Order.placeOrder())它会发布一个事件(例如OrderPlaced).事件将作为事件存储发送到MQ.
域逻辑(Order.placeOrder())应该是一个原子API,@Transactional如果使用Spring作为事务管理器,它应该有注释.
现在我的问题是:
如何确保数据库更改和事件发送在同一个事务中?即如果在将数据提交到DB时出现任何错误,则该事件永远不应发送给MQ.
我知道有像XA或2阶段提交这样的解决方案来强制DB更新并在同一事务中发送MQ消息.但似乎现在还没有广泛使用.
如果仍然使用Spring @Transactional注释而没有XA,那么在事务成功提交后我们可能会做一些逻辑吗?这样做的最佳做法是什么?
java spring domain-driven-design transactions event-handling