mongoose事務-transactions


參考文檔:https://www.npmjs.com/package/mongoose-transactions

Transactions:

事務是一組連續的數據庫操作,它的執行方式就像是一個單獨的工作單元。換句話說,除非組中的每個單獨操作都成功,否則事務永遠不會完成。如果事務中的任何操作失敗,則整個事務都將失敗。

你可以把許多Mongodb查詢集中到一個組中,並將它們作為事務的一部分一起執行。

安裝

$ npm i mongoose-transactions

安裝並保存配置

$ npm i -S mongoose-transactions

API

創建新實例

const Transaction = require("mongoose-transactions");
 
const transaction = new Transaction();

添加一個操作

/ * *
*創建插入事務和回滾狀態。
* @param modelName—包含mongoose模型名稱的字符串。 * @param data -包含要插入到mongoose模型的數據的對象。 * @returns id -要插入的對象的id。 * / const id =事務。插入(“modelName”,對象); / * * *創建findOneAndUpdate事務和回滾狀態。 * @param modelName—包含mogoose模型名稱的字符串。 * @param findId—要更新的對象的id。 * @param dataObj -包含要更新到mongoose模型的數據的對象。 * @param options -更新操作選項對象為{new: true} * / 事務。更新(“modelName”,id,對象,選項); / * * *創建刪除事務和回滾狀態。 * @param modelName—包含mongoose模型名稱的字符串。 * @param findObj -包含查找mongoose集合的數據的對象。 * / 事務。刪除(“modelName”、身份證);

運行操作

/ * *
*如果發生任何錯誤,回滾執行的操作。
* @param         stepNumber -(可選)要回滾的操作數-默認為length of * 操作成功運行 * @returns 對象數組——通過回滾操作返回的對象 * Error -錯誤對象包含: * data -操作的輸入數據 * error -操作返回的錯誤 * executedTransactions——回滾操作的數量 * 保留事務——未回滾操作的數量 * / transaction.rollback ();/ /返回承諾 

清除

/ * *
清除transactions對象,以便在同一個實例上開始一個新的事務。
* / transaction.clean ();//清除以前的操作

舉例

Full example:

const Transaction = require("mongoose-transactions"); const transaction = new Transaction(); const person = "Person"; // 注冊模式名稱  const jonathanObject = { age: 18, name: "Jonathan" }; const aliceObject = { age: 23, name: "Alice" }; async function start() { try { const jonathanId = transaction.insert(person, jonathanObject); transaction.update(person, jonathanId, aliceObject); transaction.remove(person, "fakeId"); // 這個操作失敗了 const final = await transaction.run(); // 希望(final[0].name).toBe('Jonathan') } catch (error) { console.error(error); const rollbackObj = await transaction.rollback().catch(console.error); transaction.clean(); // expect(rollbacks[0].name).toBe('Alice') // expect(rollbacks[0].age).toBe(aliceObject.age) // expect(rollbacks[1].name).toBe('Jonathan') // expect(rollbacks[1].age).toBe(bobObject.age)  } } start();

操作對象

你可以調用getOperations方法獲取操作對象

/**
 * Get transaction operations array from transaction object or collection on db.
 * @param transactionId - Optional. If the transaction id is passed return the elements of the transaction id
 *                                  else return the elements of current transaction (default null).
 */
const operations = transaction.getOperations();

為了調試目的,你可以檢查事務對操作對象的數組設計:

// console.log(operations)
[
  {
    /** 要運行的事務類型 */ type: string, // 'insert', 'update', 'remove' /** 要執行回滾的事務類型 */ rollbackType: string, // 'remove', 'update', 'insert' /** mongoose模型實例 */ model: any, // compiled mongoose model /** mongoose模型名稱 */ modelName: string, // 'Person' /** 如歌存在事務處理前的mongoose模型實例*/ oldModel: any, // model used for rollback /** 對象的Id */ findId: any, /** 數據 */ data: any, /** 選項配置查詢 */ options: any, /** 操作當前狀態 */ status: Status } ]; /** 操作可能的狀態為: */ Status = ["Pending", "Success", "Error", "Rollback", "ErrorRollback"];

提示:狀態會自動更新,因此你可以在需要時檢查事務的操作的當前狀態。

創建具有存儲和把事務加載到表單上的事務實例

const useDB = true;
const transaction = new Transaction(useDB);

首先你要獲取一個實際的事務ID,你可以用這個id在數據庫中加載事務對象。

/**
 * If the instance is db true, return the actual or new transaction id.
 * @throws Error - Throws error if the instance is not a db instance.
 */
const transId = await transaction.getTransactionId();

你可以調用loadDBTransaction函數在數據庫中加載一個事務對象。

/**
 * Load transaction from transaction collection on db.
 * @param transactionId - The id of the transaction to load.
 * @trows Error - Throws error if the transaction is not found
 */
await transaction.loadDbTransaction(transId);

你可以調用saveOperations方法在數據庫中保存操作對象

/**
 * Save transaction operations array on db.
 * @throws Error - Throws error if the instance is not a db instance.
 * @return transactionId - The transaction id on database
 */
const transId = await transaction.saveOperations();

完整的例子:

const Transaction = require("mongoose-transactions");
const useDB = true; const transaction = new Transaction(useDB); const person: string = "Person"; const tonyObject: any = { age: 28, name: "Tony" }; const nicolaObject: any = { age: 32, name: "Nicola" }; async function start() { // 在事務實例上創建操作 const id = transaction.insert(person, tonyObject); transaction.update(person, id, nicolaObject, { new: true }); // 獲取和保存創建的操作,saveOperations方法返回保存在數據庫上的事務id const operations = transaction.getOperations(); const transId = await transaction.saveOperations(); // 創建一個新的事務實例 const newTransaction = new Transaction(true); // 使用transId在新事務實例中加載保存的操作  await newTransaction.loadDbTransaction(transId); // 如果需要,可以獲取操作對象 const newOperations = newTransaction.getOperations(); // 最后運行並回滾 try { const final = await newTransaction.run(); } catch (err) { const rolled = await newTransaction.rollback(); } } start();


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM