Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 使用NodeJS在mssql中创建嵌套事务_Node.js_Sql Server - Fatal编程技术网

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

Node.js 使用NodeJS在mssql中创建嵌套事务,node.js,sql-server,Node.js,Sql Server,我正在尝试使用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",

我正在尝试使用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);
            });
        });
    }
我必须创建两个事务,这样我就可以启动一个事务并对不同的存储过程id执行一组操作。如果出现任何问题,我可以使用第一个事务恢复到原始状态


简言之,我试图实现以下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
我的问题是如何创建嵌套事务,以便在第一个事务完成后发生任何错误时可以恢复整个事务。多谢各位

先读一下这个

查看SQL Server嵌套事务或保存点是否真的对您有帮助

然后,您可能需要通过使用sql.execute发出事务控制语句来自行处理此问题,例如:

如何创建嵌套事务,以便在第一个事务完成后发生任何错误时恢复整个事务

你所拥有的一切都能做到。嵌套事务不是真实的,因此调用

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
先读这个

查看SQL Server嵌套事务或保存点是否真的对您有帮助

然后,您可能需要通过使用sql.execute发出事务控制语句来自行处理此问题,例如:

如何创建嵌套事务,以便在第一个事务完成后发生任何错误时恢复整个事务

你所拥有的一切都能做到。嵌套事务不是真实的,因此调用

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

我是否可以在不回滚保存的事务的情况下回滚整个事务?否。这将是一个自治事务,SQL Server不支持这一点。也许你可以在你的问题中添加一些关于你真正想要达到的目标的额外信息;BEGIN TRAN M2 INSERT INTO dbo.dest Code,Text,Type varchar50'Love',Text varchar50 2-Type-int COMMIT TRAN M2//我正在调用另一个Sp,它类似于此SELECT*FROM dbo.dest//验证代码//如果错误回滚TRAN T1如果我有多个事务,在同一个数据库上执行操作的,它会同时保存它们还是会在当前事务上应用保存点。每个会话只有一个事务。我可以回滚整个事务而不回滚保存的事务吗?否。这将是一个自治事务,SQL Server不支持这一点。也许你可以在你的问题中添加一些关于你真正想要达到的目标的额外信息;BEGIN TRAN M2 INSERT INTO dbo.dest Code,Text,Type varchar50'Love',Text varchar50 2-Type-int COMMIT TRAN M2//我正在调用另一个Sp,它类似于此SELECT*FROM dbo.dest//验证代码//如果错误回滚TRAN T1如果我有多个事务,在同一个数据库上执行操作的,它会同时保存它们还是将保存点应用于当前事务。每个会话只有一个事务。