如何确保所有操作(向客户收费,发送电子邮件,在数据库中插入新的“订单”行)都可以成功结帐?

时间:2019-07-17 06:14:56

标签: node.js e-commerce checkout atomicity

当客户完成结帐时,将发生以下三个操作。 (用node.js编写)

  1. 将向他收取商品费用(PayPal或其他类似技术)。
  2. 确认电子邮件将发送给客户(nodemailer)。
  3. 新的“订单”记录将添加到数据库(PostgreSQL)。

问题是我不知道如何确保以上所有三个操作均成功,否则所有操作都将失败。我不希望发生的事情是其中一些成功而其他失败。 PostgreSQL(atomicity)支持此属性。但是,其他两个操作似乎不支持这种属性。

try {
    ...
    await chargeCustomer();
    await sendMail();
    await db.commit(); // add a new "order" record to the database
} catch (err) {
    await db.rollback();
}

如您所见,如果“ chargeCustomer()”失败,则不会有任何问题,因为数据库可以“回滚”。但是,如果它在“ sendMail()”处失败,我将无法回滚“ chargeCustomer()”,因为它不支持这种操作。

典型的电子商务网站如何处理这种情况?

0 个答案:

没有答案