现在我正在使用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));