首页 > 解决方案 > Node.js MS SQL 事务

问题描述

任何人都可以帮助在 Node.js 中实现 MS SQL 事务。我试图在一个承诺中执行多个存储过程。

方法一

const executeProcedure = async (data1, data2) => {
    try {
        // sql connection 
        let dbConn  = new sql.ConnectionPool(config));
        await dbConn.connect();
        let transaction = new sql.Transaction(dbConn);

        await transaction.begin().then(async()=> {
            // tranaciton create
            // begin tran
    
            let result  = await insertOperation(transaction, data1);
            let result2 = await updateOperation(transaction, data2);

            let result1 = await  Promise.all([result, result2]);
            await transaction.commit();
            dbConn.close();

        }).catch(async(err)=> {
            await transaction.rollback();
            dbConn.close();
            throw err;
        });

        return {};
    }
    catch (error) {
        throw(error);
    }
}

方法二

const insertOperation   = async (transaction,data1) => {
    return new Promise((resolve, reject) => {
        try {
            var request = new sql.Request(transaction);
            request.input('data1'      , sql.NVarChar(40)   , data1)
            .execute('dbo.insertOperation').then((recordSet) => {
                resolve(recordSet.recordsets);
            }).catch((err) => {
                reject(err);
            });
        }
        catch (error) {
            reject(error);
        }
    });
}

方法三

const updateOperation   = async (transaction,data2) => {
    return new Promise((resolve, reject) => {
        try {
            var request = new sql.Request(transaction);
            request.input('data2'      , sql.NVarChar(40)   , data2)
            .execute('dbo.updateOperation').then((recordSet) => {
                resolve(recordSet.recordsets);
            }).catch((err) => {
                reject(err);
            });
        }
        catch (error) {
            reject(error);
        }
    });
}

现在我收到此错误 无法回滚事务。有一个请求正在进行中。

任何人请帮我解决这个问题

标签: node.jssql-serverpromisetransactionssqltransaction

解决方案


@ikhvjs 请同时检查以下用例

  try {
    request.input("data", sql.NVarChar(40), data1);

    const result = await request.execute("dbo.insertOperation");

    return result.recordsets;
  } catch (err) {
    throw err;
  }
};

const updateOperation = async (request, data2) => {
  try {
    request.input("data", sql.NVarChar(40), data2);

    const result = await request.execute("dbo.updateOperation");

    return result.recordsets;
  } catch (err) {
    throw err;
  }
};

const executeProcedure = async (data1, data2) => {
  try {
    // sql connection
    const dbConn = new sql.ConnectionPool(config);
    await dbConn.connect();
    const transaction = new sql.Transaction(dbConn);
    try {
      await transaction.begin();

      const request = new sql.Request(transaction);

      const results = await Promise.all([
        insertOperation(request, data1),
        updateOperation(request, data2),
      ]);

      await transaction.commit();
    } catch (err) {
      await transaction.rollback();
      throw err;
    } finally {
      await dbConn.close();
    }
  } catch (error) {
    throw error;
  }
};```

推荐阅读