javascript - 如何使用事务内循环运行多个存储过程?

标签 javascript node.js

使用 Nodejs 和 https://www.npmjs.com/package/mssql

我有多个存储过程,并且希望异步运行,因为即将到来的迭代取决于之前的结果。

transaction.begin(async error => {
    try {
        let count = 0;

        transactions.forEach(t => {
            const request = new db.sql.Request(transaction);

            request.execute(t, (error, recordsets) => {
                console.log(error)
                if (recordsets && recordsets.returnValue !== 0) {
                    transaction.rollback();
                    return res.status(422).json([responses[recordsets.returnValue]]);
                }

                if (recordsets && recordsets.returnValue === 0 && transactions.length === count) {
                    transaction.commit(tErr => tErr && next('transaction commit error'));
                    return res.status(200).json([responses[0]]);
                }
            });
            count++;
        });
    } catch (err) {
        transaction.rollback(
            tErr => tErr && done('transaction rollback error')
        );
    }
});

错误:

TransactionError: Can't acquire connection for the request. There is another request in progress.

transactions.forEach每次迭代都应该适用于request.execute(回调)的结果

最佳答案

请检查是否有必要创建这样的新对象 const request = new db.sql.Request(transaction);

你可以通过两种方式做到这一点,但我认为为此,第一个选择是。

  1. 一个使其异步。 transactions.forEach(async t => {等待 request.execute(t, (错误, 记录集) => {

  2. 尝试将其写为promise,并使用Promise.all()获取所有结果

https://www.npmjs.com/package/mssql#promises https://www.npmjs.com/package/mssql#asyncawait

https://jsfiddle.net/reaxdbnz/

关于javascript - 如何使用事务内循环运行多个存储过程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58118203/

相关文章:

javascript - 无法进行 grunt 预处理以替换值

node.js - .then() 函数在主函数完成之前被调用 - Q.nfcall

node.js - RequestError : Error: getaddrinfo ENOTFOUND, 不适用于所有用户

javascript - "Unexpected token ILLEGAL"没有明显的原因

javascript - Material -UI |在 makeStyles 中使用 `theme`

javascript - 尝试从 npm 永久安装

node.js - 在全局 npm install 上构建 Git 依赖

javascript - 如何使用 Word JS API 删除插入的 OOXML 注释?

javascript - 忽略/不转换时区?

javascript - 以编程方式打开 Vuetify 中的每个扩展面板