如何在MongoDb中开始交易?

时间:2020-10-18 03:48:39

标签: node.js mongodb transactions

我正在尝试阻止对特定记录的并发请求,请参见以下示例:

function addMoney(orderID,orderID){
    const status = Database.getOrder(orderID);

    if (status === 1){
        return "Money Already Added";
    }

    Database.udateOrder(orderID, {status: 1});

    Database.addMoney(userID, 300);

    return true;
}

假设某人恰好在同一时间发出了此请求,因此通过了“状态”检查,他们将能够使Database.addMoney运行两次。

使用MySQL,我将开始进行横移以锁定行,但不确定如何使用MongoDB来锁定行。

1 个答案:

答案 0 :(得分:2)

您可以像MySQL一样在mongodb中进行事务。考虑拥有一个orderid:123的{​​{1}}文档。然后,您可以检查交易中的状态,并返回它是否已经付款或未完成以添加现金单据和更新订单状态。 如果您遇到status:0 this link之类的问题,可能会有所帮助。

为了使用事务,您需要一个MongoDB副本集,并且 在本地启动副本集进行开发是一个复杂的过程。 新的run-rs npm模块使启动副本集变得容易。

Transaction numbers are only allowed on a replica set member or mongos

上面的代码可能需要改进,因为我无法在具有副本集的MongoDB上对其进行测试。