节点Js - 使用mssql的TransactionError(ENOTBEGUN)

时间:2017-05-09 17:49:41

标签: javascript node.js transactions

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

我想在事务中执行三个语句,但是当我尝试提交时,它会返回一个错误:TransactionError:Transaction尚未开始。首先调用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);
             });
        });
    }

1 个答案:

答案 0 :(得分:0)

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

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

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

要提交交易,也可以使用

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

尝试使用 async await ,因为整个过程都是异步的。