避免对数据库的双重请求

时间:2018-04-26 07:07:59

标签: node.js vue.js nuxt.js

我在Nuxt.js(vue.js和node.js)上构建了一个电子商务解决方案,其中包含一个名为Cockpit的无头cms。我使用的是第三方支付网关,当付款有效时,会将用户重定向到回调网址。

在我的回调网址上,我有多项操作:创建货件,向Cockpit添加订单并将订单数据发布到发票软件。还会生成确认邮件和运输标签。标签和邮件也会被发送两次,这对客户来说很烦人+生成运输标签需要花钱。一切都是按照预期发布和工作。

我的问题是,支付网关有时会在几毫秒内调用我的回调网址,因此在Cockpit中创建一个重复的订单,因为第一个请求在第二个请求启动之前尚未完成,因此检查双重订单失败,因为理论上还没有具有该交易ID的订单。

要检查双重订单,我会执行以下操作 - 只要用户点击回调网址即可完成此操作:

  • 我检查是否已经从支付网关获得了交易ID 存在于Cockpit中。
  • 我检查服务器中是否存在事务ID 会议已经。

我的问题最终是 - 你们有什么建议我如何避免和消除这些双重订单?也许有些人之前尝试过这样的事情?

我很抱歉这篇长篇文章,但我认为有必要在StackOverflow上提出一个有效的问题

1 个答案:

答案 0 :(得分:1)

似乎问题不在您身边:第一个问题是“为什么第三方支付网关会拨打您的回拨两次?是否支付2笔费用?”我认为你应该先在支付网关人员的帮助下,先解决这个问题,因为这不正常。

与此同时,或者如果你无法在另一方面解决,你可以尝试为当前订单或回调函数的队列实现某种锁定,这样如果对它进行第二次回调订单到达,它可以被阻止,丢弃或停止,直到第一个结束(并且,此时,我认为第二个呼叫将找到已处理的订单,因此不再有双重打印和电子邮件)