使用MySQL在Node.js中进行事务管理

Vis*_*ran 1 mysql node.js express sequelize.js

我正在使用MySQL开发nodejs 。在将数据插入到多个表中时,我需要实现事务管理。这样,如果发生任何错误,我就可以回滚所有插入。

所有与DB相关的操作都在DB层中每个实体的不同类中声明。在单个操作上的业务逻辑层中,我们可能需要处理来自不同实体的多个数据库层调用。在JAVA Spring中,我们可以在服务层上简单地注释 @Transaction

nodejs中有类似的东西吗?

Wit*_*ult 5

NodeJs mysql具有非常好的事务管理,但与Spring并不完全相似。但是概念很相似-

  1. 创建数据库连接
  2. 连接到数据库使用 connect

  3. 使用开始交易 beginTransaction

  4. 执行交易查询
  5. 如果任何查询失败,请使用rollback。这将中止事务。
  6. 如果一切顺利 commit
  7. 关闭连接使用 end

一个例子 -

const mysql = require('mysql');
 
const connection = mysql.createConnection(
    {
      host     : 'YOUR_HOST',
      user     : 'YOUR_USERNAME',
      password : 'YOUR_PASSWORD',
      database : 'YOUR_DB_NAME'
    }
);
 
connection.connect(function(err) {
  if (err) {
    console.error('error connecting: ' + err.stack);
    return;
  }
  console.log('connected as id ' + connection.threadId);
});
 
/* Begin transaction */
connection.beginTransaction(function(err) {
  if (err) { throw err; }
  connection.query('YOUR QUERY', "PLACE HOLDER VALUES", function(err, result) {
    if (err) { 
      connection.rollback(function() {
        throw err;
      });
    }
 
    const log = result.insertId;
 
    connection.query('ANOTHER QUERY PART OF TRANSACTION', log, function(err, result) {
      if (err) { 
        connection.rollback(function() {
          throw err;
        });
      }  
      connection.commit(function(err) {
        if (err) { 
          connection.rollback(function() {
            throw err;
          });
        }
        console.log('Transaction Completed Successfully.');
        connection.end();
      });
    });
  });
});
/* End transaction */
Run Code Online (Sandbox Code Playgroud)

如果您想使其更具动态性,那就只是一个想法。我在代码中添加了一些注释。您可能需要更改代码以适合您的要求。基本上,您将查询数组与查询值一起传递,然后所有这些查询都在事务中运行。--

function executeTransaction(queries) {
    try {
      const connection = yield getConnectionObj({/* your db params to get connection */)
  
      let results = []

      return new Promise(function(resolve, reject) {
        connection.beginTransaction(function (err) {
          if (err) throw err

          console.log("Starting transaction")

          queries
            .reduce(function (sequence, queryToRun) {
              return sequence.then(function () {
                /* pass your query and connection to a helper function and execute query there */
                return queryConnection(
                  connection,
                  query,
                  queryParams,
                ).then(function (res) {
                  /* Accumulate resposes of all queries */
                  results = results.concat(res)
                })
              }).catch(function (error) {
                reject(error)
              })
            }, Promise.resolve())
            .then(function () {
              connection.commit(function (err) {
                if (err) {
                  connection.rollback(function () {
                    throw err
                  })
                }
                console.log('Transactions were completed!')
                /* release connection */
                connection.release()
                /* resolve promise with all results */
                resolve({ results })
              })
            })
            .catch(function (err) {
              console.log('Transaction failed!')
              connection.rollback(function () {
                console.log('Abort Transaction !!!')
                throw err
              })
            })
        })
      })
   /* End Transaction */

    } catch (error) {
      return Promise.reject(error)
    }
  }
Run Code Online (Sandbox Code Playgroud)

我希望这有帮助。