我正在尝试阻止对特定记录的并发请求,请参见以下示例:
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来锁定行。
答案 0 :(得分:2)
您可以像MySQL一样在mongodb中进行事务。考虑拥有一个order
和id:123
的{{1}}文档。然后,您可以检查交易中的状态,并返回它是否已经付款或未完成以添加现金单据和更新订单状态。
如果您遇到status:0
this link之类的问题,可能会有所帮助。
为了使用事务,您需要一个MongoDB副本集,并且 在本地启动副本集进行开发是一个复杂的过程。 新的run-rs npm模块使启动副本集变得容易。
Transaction numbers are only allowed on a replica set member or mongos
上面的代码可能需要改进,因为我无法在具有副本集的MongoDB上对其进行测试。