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