【发布时间】:2011-07-15 18:20:38
【问题描述】:
如果我们需要更新 CUSTOMER 文档并在同一事务中发送电子邮件,那么确保以原子方式完成此操作的最佳方法是什么?我们正在构建一个 ecomm 网站,我们需要这个功能,因为当客户购买商品时,我们必须更新他们的订单历史记录并向他们发送电子邮件确认。在使用 RDBMS 数据库的 Java 中,我们很容易做到这一点,只需更新数据库并发送包含电子邮件内容和详细信息的 JMS 消息; JDBC 和 JMS 都支持分布式事务,因此如果出现问题,都可以回滚,但 MongoDB 则不然。 Mongo 中有消息传递功能吗?
我们正在考虑在 Customer 的 orderHistory 嵌入文档中使用标志“emailSentFlag”。下订单时,该标志设置为 false。然后,我们将使用一个外部作业来扫描 emailSentFlag="false" 的所有订单历史记录并在那时发送电子邮件,但这会使我们回到相同的情况,因为我们必须在发送后将标志设置回“true”电子邮件,这不是原子的。
> customer {
> name:
> email:
> orderHistory{
> orderId:
> status:
> emailSentFlag:
【问题讨论】:
-
小心! MongoDB 不支持事务! mongodb.org/display/DOCS/…
-
我知道,但我必须让两个操作一起工作,有什么建议吗?
-
JMS 如何确保邮件发送一次且准确一次?当然,它可以将它放入队列并确保它至少被处理一次,但它可能会在发送邮件到 smtp 之后以及在设置作业完成之前崩溃,因此它会再次执行它。我错过了什么吗?
标签: email mongodb transactions