好的,我想这就是我正在寻找的解决方案;查看文档我得出的结论是,在这种情况下需要进行交易。 Here is the documentation
总而言之,在我的情况下,我首先需要获取所有购物车项目,看看是否有一个产品具有多个变体,如果是,我需要相应地格式化该数据,以便稍后构建我的查询对象。这看起来像这样(为了稀疏起见再次缩短):
- 发布到 api 的购物车商品
[{
"productId": "ID here",
...
"variant": {
"variantId": "ID here",
...
"variantStock": 160
},
"qty": 1
}, {
"productId": "same ID",
...
"variant": {
"variantId": "ID here",
...
"variantStock": 160
},
"qty": 1
}, ... ]
- 关联产品更新的数据
const uniqueProductIds = [...new Set(cartItems.map((item) => item.productId))];
const stockUpdateData = uniqueProductIds.map((id) => ({ productId: id, variants: cartItems.filter((item) => item.productId === id).map((item) => ({ variantId: item.variant.variantId, qty: item.qty, variantStock: item.variant.variantStock }))}));
到目前为止,一切都很好。我拥有一切所需的一切。在我的具体情况下,我首先更改数据库中的内容,然后向客户收费,因此如果数据库中出现任何问题,我只是不收费并通知用户错误等。这是上述文档中的交易的来源。由于我需要先创建订单,然后相应地创建所有库存,因此我可以确定这将遵循 ACID 原则的唯一方法是进行交易。
所以我只是创建一个会话对象,调用withTransaction() 方法并创建订单并从购物车相关数据更新所有产品变体库存。如果一切顺利,我只需向客户收费并通过简单的更新将付款 ID 添加到订单中。
经过测试,它似乎按预期工作,但如果有人有更好或更简单的想法,我很想听听。另外,欢迎任何建设性的 批评!