Nodejs 连接mysql 事务问题

Nodejs 连接mysql 事务问题

node.js 连接mysql
有没有针对事务的相关操作?

3 回复

当然可以。在 Node.js 中连接 MySQL 并进行事务处理是一个常见的需求,尤其是在需要确保数据一致性和完整性的场景中。MySQL 支持事务处理,并且可以通过 Node.js 的 MySQL 客户端库(如 mysqlmysql2)来实现。

示例代码

以下是一个使用 mysql2 库的示例代码,展示了如何在 Node.js 中执行 MySQL 事务:

  1. 首先安装 mysql2 库:

    npm install mysql2
    
  2. 然后编写代码以处理事务:

const mysql = require('mysql2/promise');

// 创建数据库连接池
const pool = mysql.createPool({
  host: 'localhost',
  user: 'root',
  database: 'testdb',
  waitForConnections: true,
  connectionLimit: 10,
  queueLimit: 0
});

async function performTransaction() {
  let conn;
  try {
    // 获取数据库连接
    conn = await pool.getConnection();
    
    // 开始事务
    await conn.query('START TRANSACTION');
    
    // 执行第一个 SQL 语句
    const [result1] = await conn.query('INSERT INTO users (name, email) VALUES (?, ?)', ['Alice', 'alice@example.com']);
    console.log(`Inserted user with ID: ${result1.insertId}`);
    
    // 执行第二个 SQL 语句
    const [result2] = await conn.query('UPDATE users SET email = ? WHERE id = ?', ['alice.new@example.com', result1.insertId]);
    console.log(`Updated user with ID: ${result1.insertId}`);
    
    // 提交事务
    await conn.commit();
    console.log('Transaction committed successfully.');
  } catch (err) {
    // 如果发生错误,则回滚事务
    if (conn) {
      await conn.rollback();
      console.error('Transaction rolled back due to an error:', err);
    }
    throw err; // 抛出错误以便进一步处理
  } finally {
    // 释放连接
    if (conn) conn.release();
  }
}

performTransaction().catch(err => console.error('Error in transaction:', err));

解释

  1. 创建连接池:首先,我们创建一个数据库连接池,这有助于管理多个数据库连接。

  2. 获取连接:使用 pool.getConnection() 方法从连接池中获取一个数据库连接。

  3. 开始事务:通过执行 START TRANSACTION 命令来启动一个新的事务。

  4. 执行 SQL 语句:在事务中执行一系列 SQL 语句,例如插入和更新数据。

  5. 提交事务:如果所有操作都成功,则调用 conn.commit() 来提交事务。

  6. 回滚事务:如果在执行过程中发生错误,则调用 conn.rollback() 来回滚事务,从而撤销所有已执行的操作。

  7. 释放连接:无论事务是否成功,都要确保释放连接,以便其他请求可以使用它。

通过这种方式,你可以确保一组相关的数据库操作要么全部成功,要么全部失败,从而保持数据的一致性。


在 Node.js 中连接 MySQL 并进行事务处理,可以使用 mysqlmysql2 模块。这两个模块都支持事务操作,可以通过 START TRANSACTIONCOMMITROLLBACK 语句来管理事务。

下面是一个使用 mysql2 模块的示例代码:

const mysql = require('mysql2/promise');

async function performTransaction() {
    const connection = await mysql.createConnection({
        host: 'localhost',
        user: 'root',
        database: 'testdb',
        password: 'yourpassword'
    });

    try {
        // 开始事务
        await connection.query('START TRANSACTION');
        
        // 执行多个 SQL 语句
        await connection.query('INSERT INTO users (name) VALUES (?)', ['Alice']);
        await connection.query('INSERT INTO users (name) VALUES (?)', ['Bob']);

        // 提交事务
        await connection.query('COMMIT');
        console.log('Transaction committed successfully.');
    } catch (error) {
        // 回滚事务
        await connection.query('ROLLBACK');
        console.error('Transaction failed, rolled back:', error);
    } finally {
        // 关闭连接
        await connection.end();
    }
}

performTransaction();

解释

  1. 创建连接:使用 mysql.createConnection 创建一个到 MySQL 数据库的连接。
  2. 开始事务:执行 START TRANSACTION 语句开始一个新的事务。
  3. 执行 SQL 语句:在事务中执行多个 SQL 语句。这些语句会作为一个整体被执行,要么全部成功提交,要么全部失败并回滚。
  4. 提交事务:如果所有语句都成功执行,则执行 COMMIT 提交事务。
  5. 回滚事务:如果任何语句执行失败,则执行 ROLLBACK 回滚事务,恢复到事务开始前的状态。
  6. 关闭连接:最后关闭数据库连接。

通过这种方式,你可以确保一系列操作的原子性,即要么全部完成,要么全部不完成。

回到顶部