代码之家  ›  专栏  ›  技术社区  ›  user3510665

使用NodeJS在mssql中创建嵌套事务

  •  0
  • user3510665  · 技术社区  · 5 年前

    我试图使用MSSQL NPM在NodeJ中创建嵌套事务。我正在使用以下代码块

    var sqlModule = require("mssql");
    
    var sqlManagerClass = require("./sqlManager.js");
    
    var sql = new sqlManagerClass(sqlModule);
    sql.setConfig({
      user: "dbo",
      password: "***********",
      server: "127.0.0.1",
      database: "dbname",
      requestTimeout: 120000,
    });
    
    sql.beginTransaction(function (transaction) {
      if (transaction == null) {
        callback("Unable to Start Transaction", null);
        return;
      }
      sql.beginTransaction(function (newTransaction) {
        if (newTransaction == null) {
          callback("Unable to Start newTransaction", null);
          return;
        }
        sql.execute(
          "dbname.dbo.insert_dest",
          [],
          [],
          function (err, results) {
            console.log(results);
            newTransaction.commit(function (err) {
              if (err) {
                console.log(err);
              }
              sql.execute("dbname.dbo.select_dest", [], [], function (
                err,
                results2
              ) {
                if (err) {
                  console.log(err);
                  return;
                }
                console.log(results2);
                transaction.rollback(function (rollBackErr) {
                  if (rollBackErr) {
                    console.log(rollBackErr);
                  }
                  sql.execute("dbname.dbo.select_dest", [], [], function (
                    err,
                    results2
                  ) {
                    if (err) {
                      console.log(err);
                      return;
                    }
                    console.log(results2);
                    console.log('end')
                  });
                });
              });
            });
          },
          newTransaction
        );
      });
    });
    

    创建交易

    this.beginTransaction = function(callback, transaction) {
    
    
            // if the optional transaction argument is passed in, we are already working with a transation, just return it
            if (typeof transaction !== "undefined") {
                callback(transaction);
                return;
            }
            self.connectSql(function(err) {
    
                var transaction = new self.sql.Transaction(self.connection);
    
                transaction.begin(function(err) {
                    // ... error checks 
                    if (err) {
                        self.log("SQLManager - Error Beginning Transaction " + err);
                        callback(null);
                    }
    
                    // callback with the transaction handler
                    callback(transaction);
                });
            });
        }
    

    我必须创建2个事务,这样我就可以启动一个事务,并在不同的存储过程上执行一组操作。如果出现任何问题,我可以使用第一个事务恢复到原始状态。

    简而言之,我试图实现以下SQL代码

    BEGIN TRAN T1;
    BEGIN TRAN M2
    INSERT INTO dbo.dest
    (
        Code,
        Text,
        Type
    )
    VALUES
    (   'l', -- Code - varchar(50)
        'Love', -- Text - varchar(50)
        2   -- Type - int
        )
    COMMIT TRAN M2
    // I am calling another Sp which is similar to this
    SELECT * FROM dbo.dest
    //validation the code 
    //if error
    ROLLBACK TRAN T1
    

    我的问题是如何创建嵌套事务,以便在第一个事务完成后出现任何错误时,我可以恢复整个事务。非常感谢。

    0 回复  |  直到 5 年前
        1
  •  2
  •   David Browne - Microsoft    5 年前

    先读这个

    A SQL Server DBA myth a day: (26/30) nested transactions are real

    看看SQL Server的“嵌套事务”或保存点是否真的能帮助你。

    然后,您可能必须通过使用以下命令发出事务控制语句来自己处理这一切 sql.execute() 如:

    sql.execute("begin transaction");
    //something that works
    sql.execute("save transaction MyTran");
    //something that fails
    sql.execute("rollback transaction MyTran");
    sql.execute("commit transaction");
    

    如何创建嵌套事务,以便在第一个事务完成后出现任何错误时,可以还原整个事务

    你所拥有的会做到这一点。嵌套事务不是真实的,因此调用

    begin tran
    ...
    begin tran --<-- @@trancount += 1, but nothing else really happens
    ...
    commit tran --<--nothing is really commited yet. @@trancount -= 1
    ...
    rollback tran --<-- all work is rolled back