国产日韩精品视频_2020久久国产最新免费观看_国内久久久久影院精品_日本一区二区视频在线

當我使用promise數(shù)組(Promise.all)時,Mongoose事務不會回滾

我在這里遇到了一個奇怪的情況,我試圖在一個數(shù)組中插入一些寫查詢(所有這些查詢都屬于同一個事務),并使用Promise.all(arr)對整個事務執(zhí)行/回滾。問題是,如果我的代碼拋出錯誤,并且我在調用Promise.all()之前中止了事務,那么promise數(shù)組中的操作to-be-done將被提交!。但是,如果我的代碼在調用Promise.all()后拋出錯誤,文檔將按預期恢復到原始狀態(tài)。如何避免在調用Promise.all()之前拋出異常而導致事務中止的情況下提交對文檔的更改。

這是代碼剪

module.exports.updateVariantStock = async (req, res, next) => {
  const session = await mongoose.startSession();
  try {

    session.startTransaction();

    const opts = { session };

    const { newStock } = req.body;

    const { variant } = req.mydata;

    const promises = [];

    variant.stock = Number(variant.stock) + Number(newStock);

    const variantPromise = variant.save(opts);
    promises.push(variantPromise);

    const stockLogElement = new VariantStockLogElement({
     // Data to insert
    });

    const newStockLogContainerPromise = stockLogElement.save(opts);

    promises.push(newStockLogContainerPromise);

    throw new Error("A test error"); // If error is thrown here, changes are commited
    await Promise.all(promises);
    throw new Error("A test error"); // If error is thrown here, changes are rolled-back

    await session.commitTransaction();
  
    return res.status(200).json({ success: "Stock is updated." });
  } catch (err) {
      await session.abortTransaction();
    next(err);
  } finally {
    session.endSession();
  }
};

請注意,如果在拋出此錯誤之前運行任何數(shù)據(jù)庫查詢(與事務無關),則更改為rolled-back。但我犯了這個錯誤

UnhandledPromiseRejectionWarning: MongoError: Transaction with { txnNumber: 1 } has been aborted.

我真的不明白這里發(fā)生了什么。

? 最佳回答:

當將Promise.all與MongoDB中的事務一起使用時,注意承諾的結算順序是很重要的。在您的代碼中,當您在調用Promise.all(promise)之前拋出錯誤時,數(shù)組中的promise可能已經(jīng)開始執(zhí)行,而MongoDB可能會將這些更改視為事務之外的單獨操作。但是,如果在調用Promise.all(promise)后拋出錯誤,則這些操作將綁定到同一事務中。為了確保在調用Promise.all之前不會執(zhí)行數(shù)組中的promise,您可以將換行new Error(“A test Error”)移動到Promise.all(promise)之后。你可以考慮這樣做,

// Execute promises within the transaction
const promiseResult = await Promise.all(promises);

// Check if any promise rejected
const hasRejectedPromise = promiseResult.some(p => p instanceof Error || p instanceof mongoose.Error);

if (hasRejectedPromise) {
      throw new Error("A test error"); // If error is thrown here, changes are rolled-back
}

await session.commitTransaction();

但是,如果出于某種原因,您的目標是在單個promise拋出錯誤時立即中止事務,則可以通過刪除Promise.all并使用try...catch塊單獨處理每個promise來實現(xiàn)這一點。如果任何promise拋出錯誤,您可以立即中止事務并處理錯誤。考慮一下這樣的事情,

    variant.stock = Number(variant.stock) + Number(newStock);
    const variantPromise = variant.save(opts);

    try {
      await variantPromise; // Handle the promise individually
    } catch (error) {
      // If an error occurs, immediately abort the transaction
      await session.abortTransaction();
      throw error;
    }

    const stockLogElement = new VariantStockLogElement({
      // Data to insert
    });

    const newStockLogContainerPromise = stockLogElement.save(opts);

    try {
      await newStockLogContainerPromise; // Handle the promise individually
    } catch (error) {
      // If an error occurs, immediately abort the transaction
      await session.abortTransaction();
      throw error;
    }

    await session.commitTransaction();
    // .... Continue with the rest of your code ...
国产日韩精品视频_2020久久国产最新免费观看_国内久久久久影院精品_日本一区二区视频在线

亚洲在线免费| 国户精品久久久久久久久久久不卡 | 欧美激情一区二区三区四区| 国产欧美日韩一区二区三区在线观看| 亚洲激情社区| 暖暖成人免费视频| 伊人影院久久| 久久亚洲综合网| 韩国精品一区二区三区| 亚洲欧美日韩国产中文在线| 欧美午夜宅男影院| 99精品国产高清一区二区| 欧美大片第1页| 亚洲黄色在线看| 欧美—级a级欧美特级ar全黄| 亚洲国产午夜| 欧美极品在线播放| aa级大片欧美三级| 国产精品高清网站| 亚洲综合色视频| 国产日韩精品久久久| 久久精品国产久精国产思思| 国产日韩欧美日韩大片| 欧美一区激情| 一区在线观看| 欧美成人小视频| 亚洲精品社区| 欧美天堂亚洲电影院在线播放| 夜夜嗨网站十八久久| 国产精品a级| 欧美一站二站| 在线播放日韩欧美| 欧美日本在线视频| 亚洲欧美另类久久久精品2019| 国产精品久久久久久久久久久久 | 日韩性生活视频| 欧美色播在线播放| 欧美与欧洲交xxxx免费观看 | 国产麻豆9l精品三级站| 久久成人一区二区| 亚洲国内高清视频| 欧美日韩裸体免费视频| 午夜宅男欧美| 亚洲激情精品| 国产精品视频yy9099| 久久久久一区二区三区| 亚洲欧洲一区二区三区| 国产精品女主播在线观看 | 日韩一级视频免费观看在线| 国产精品国内视频| 久久久午夜视频| 中文成人激情娱乐网| 国内成+人亚洲| 国产精品扒开腿爽爽爽视频 | 久久综合电影| 亚洲一区二区精品视频| 136国产福利精品导航| 国产精品久久久久久一区二区三区| 久久久精品网| 在线一区视频| 亚洲黄网站在线观看| 国产色综合天天综合网| 欧美日韩国产色视频| 久久久噜噜噜久噜久久| 亚洲自拍偷拍色片视频| 亚洲欧洲一区二区三区久久| 国产欧美在线观看| 欧美性猛交视频| 欧美黄色一区| 玖玖国产精品视频| 欧美中文字幕在线视频| 99视频一区二区三区| 在线日韩电影| 国产综合精品| 国产精品一区二区三区四区五区| 欧美大片在线影院| 久久婷婷av| 久久精品视频网| 午夜精品久久久久久久| 亚洲无人区一区| 日韩午夜激情| 99re66热这里只有精品4 | 亚洲日本黄色| 亚洲国产精品成人va在线观看| 国产欧美日韩在线视频| 国产精品高潮久久| 欧美精品在线播放| 欧美大胆a视频| 蜜臀av一级做a爰片久久| 久久九九全国免费精品观看| 亚洲综合日韩中文字幕v在线| 日韩午夜精品| 亚洲人午夜精品免费| 亚洲成人资源网| 影音先锋一区| 亚洲黄色影片| 亚洲美女免费视频| 亚洲精选国产| 一本色道婷婷久久欧美| 一区二区福利| 亚洲一区二区三区精品视频| 正在播放亚洲一区| 亚洲深夜福利| 亚洲欧美电影院| 欧美亚洲综合久久| 久久久视频精品| 免费观看30秒视频久久| 欧美激情麻豆| 欧美性猛交视频| 国产精品自拍网站| 狠狠色综合一区二区| 在线精品视频免费观看| 亚洲精品乱码久久久久久蜜桃麻豆| 亚洲国产精品久久精品怡红院 | 亚洲最新视频在线| 亚洲香蕉在线观看| 欧美制服丝袜| 免费观看成人鲁鲁鲁鲁鲁视频| 你懂的亚洲视频| 欧美日韩色一区| 国产欧美丝祙| 亚洲国产欧美一区二区三区丁香婷| 亚洲日本无吗高清不卡| 亚洲少妇最新在线视频| 欧美在线观看一区二区| 欧美成人免费va影院高清| 欧美三级乱人伦电影| 国产视频在线观看一区二区三区 | 欧美中文在线视频| 嫩草国产精品入口| 欧美色欧美亚洲高清在线视频| 国产婷婷一区二区| 亚洲精品欧洲精品| 羞羞答答国产精品www一本| 欧美v日韩v国产v| 国产精品色在线| 亚洲欧洲在线免费| 午夜精品免费| 欧美片网站免费| 国产一区美女| 亚洲天堂激情| 欧美—级a级欧美特级ar全黄| 国产精品综合色区在线观看| 91久久国产综合久久蜜月精品| 午夜免费久久久久| 欧美精品一区二区在线播放| 国产精品亚洲人在线观看| 亚洲人成网站色ww在线| 欧美在线观看一区二区| 欧美性淫爽ww久久久久无| 在线观看日韩精品| 午夜精品一区二区三区在线视| 欧美精品一区二区三区在线看午夜 | 在线观看日韩一区| 午夜精品久久久久久久白皮肤 | 欧美激情在线| 韩国福利一区| 先锋影院在线亚洲| 欧美日韩一级视频| 亚洲欧洲日产国产网站| 久久久夜色精品亚洲| 国产精品一区一区三区| 一区二区电影免费观看| 欧美好吊妞视频| 亚洲第一网站| 久久久999精品免费| 国产精品一区二区久久久| 亚洲免费大片| 欧美激情一二区| 亚洲福利在线看| 久久婷婷激情| 黄色欧美成人| 久久国产夜色精品鲁鲁99| 国产欧美高清| 欧美中文字幕视频| 国产午夜久久久久| 欧美一站二站| 国产亚洲精品久久久| 欧美在线视频观看免费网站| 国产精品爽黄69| 午夜精品视频在线观看一区二区| 国产精品va在线播放| 一区二区三区黄色| 国产精品福利网站| 亚洲欧美在线网| 国产一级久久| 久久理论片午夜琪琪电影网| 精品不卡在线| 欧美国产亚洲视频| 一区二区三区精品国产| 国产精品国产馆在线真实露脸 | 欧美一区二区三区免费在线看| 国产欧美二区| 久久男女视频| 亚洲黄页一区| 欧美四级在线| 久久成人国产精品| 亚洲国产精品va在线看黑人| 欧美另类女人| 亚洲你懂的在线视频|