回滚功能的MongoDB错误回调处理

时间:2017-10-02 07:59:29

标签: mongodb error-handling rollback

现在我正在使用angularjs,expressjs和MongoDB开发功能齐全的电子商务系统。 MongoDB不提供事务查询。所以我对库存系统和支付系统使用“两阶段提交”。

但我在MongoDB错误处理中有一个问题。在“两阶段提交”中,如果在第一次查询成功后发生某些故障或错误,则回滚第一个查询。但是,如果回滚查询中发生其他错误,则无法确保回滚。下面是我的服务器端代码with expressjs。

首先将项目放入用户购物车并更新产品文档(更新购物信息)。 如果在更新产品文档查询时发生错误,则从用户的购物车中拉取项目(这是回滚过程)。

但是在回滚过程中(在这种情况下,$ pull查询),如果调用错误回调,则回滚过程失败。

有没有合理的回滚方法?

var userID = new ObjectID(Session.get(req, 'userId'));
var variantID = new ObjectID(body.variantID);
var quantity = Number(body.qty);
Cart.put(userID, variantID, quantity, body.detail).then(function(rs){
  if(rs.result.n == 0){
    Response.toJson(res, Code.EXIST_IN_CART, 'The product with this variant is already exist in your cart!', {});
  }else{
    Variant.carted(userID, variantID, quantity).then(function(rs){
      Response.toJson(res, Code.SUCCESS, 'Putting the product with a specific variant into your cart is success', {});
      }, function(){
        Cart.pull(userID, variantID).then(function(){
          Response.toJson(res, Code.FAILED, 'Failed to put item into your cart! Check stock or database exception!', {});
        }, function(){
          Response.toJson(res, Code.ROLLBACK_FAILED, 'Rollback process is failed!', {});
      });
    });
  }
}, Response.dbErrorCallback(res));

0 个答案:

没有答案