节点Js(v7.10.0)+ mssql(3.3.0)

我想在事务中执行三个语句,但是当我尝试提交时,它返回错误:TransactionError:事务尚未开始。首先调用begin()。

       var conn = new sql.Connection(dbConfig);
       conn.connect().then(function() {
          test();
       }).catch(function(err) {
          console.log(err);
       });

    function test() {
       var mssqlTransaction = new sql.Transaction(conn);
        mssqlTransaction.begin(function(err) {
             var sqlInsert = "My Insert";
             var request1 = new sql.Request(mssqlTransaction);
             request1.query(sqlInsert, function(err, recordset) {
                if (err != undefined && err.length == 0) {
                    erros.push(err);
                }
             });

             var sqlDelete = "My Delete";
             var request2 = new sql.Request(mssqlTransaction);
             request2.query(sqlDelete , function(err, recordset) {
                if (err != undefined && err.length == 0) {
                    erros.push(err);
                }
             });

             var sqlUpdate = "My Update";
             var request3 = new sql.Request(mssqlTransaction);
             request3.query(sqlUpdate , function(err, recordset) {
                if (err != undefined && err.length == 0) {
                    erros.push(err);
                }
             });

             mssqlTransaction.commit(function(err) {
                 console.log('Error in commit:'+err);
             });
        });
    }

最佳答案

这应该是评论,但我没有足够的声誉。

您的request1语句不等待交易开始,而是继续执行交易,因此等待交易开始使用

await new Promise(resolve => mssqlTransaction.begin(resolve));


并提交交易,您可能想使用

await new Promise(resolve => mssqlTransaction.commit(resolve));


尝试使用异步并等待,因为整个事情都是异步的。

07-24 09:21