Nodejs node-mysql好像不支持事务吧?Nodejs连mysql,有什么比较好的驱动?可实现中文完美支持,支持事务与回滚等等。

Nodejs node-mysql好像不支持事务吧?Nodejs连mysql,有什么比较好的驱动?可实现中文完美支持,支持事务与回滚等等。

node-mysql 好像不支持事务吧?node.js连mysql,有什么比较好的驱动?可实现中文完美支持,支持事务与回滚等等。

12 回复

当然可以。在 Node.js 中连接 MySQL 数据库时,确实有一些驱动程序可以更好地支持事务、中文字符集以及其他高级功能。一个非常流行的驱动程序是 mysql2,它是在 node-mysql 的基础上改进的,并且提供了更多的功能和更好的性能。

使用 mysql2 驱动

首先,你需要安装 mysql2 包:

npm install mysql2

示例代码

以下是一个简单的示例,展示了如何使用 mysql2 连接到 MySQL 数据库并执行事务操作。

安装和配置

确保你的 MySQL 服务器已经设置好,并且数据库中包含一个表用于测试事务。

CREATE DATABASE testdb;
USE testdb;

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    email VARCHAR(100) NOT NULL
);

Node.js 代码

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

async function main() {
    // 创建连接池
    const pool = mysql.createPool({
        host: 'localhost',
        user: 'root',
        password: 'yourpassword',
        database: 'testdb',
        charset: 'utf8mb4' // 支持中文
    });

    try {
        // 开始事务
        const connection = await pool.getConnection();
        await connection.query('START TRANSACTION');
        
        // 执行 SQL 操作
        await connection.query('INSERT INTO users (name, email) VALUES (?, ?)', ['Alice', 'alice@example.com']);
        await connection.query('INSERT INTO users (name, email) VALUES (?, ?)', ['Bob', 'bob@example.com']);
        
        // 提交事务
        await connection.commit();
        console.log('Transaction committed successfully.');
    } catch (error) {
        // 回滚事务
        await connection.rollback();
        console.error('Transaction rolled back:', error.message);
    } finally {
        // 释放连接
        connection.release();
    }
}

main().catch(console.error);

解释

  1. 创建连接池:使用 mysql.createPool 方法创建一个连接池,这样可以更高效地管理数据库连接。
  2. 开始事务:使用 START TRANSACTION 语句开始一个新的事务。
  3. 执行 SQL 操作:在事务中执行多个 SQL 操作。
  4. 提交或回滚事务:如果所有操作都成功,则调用 connection.commit() 提交事务;如果发生错误,则调用 connection.rollback() 回滚事务。
  5. 释放连接:无论成功还是失败,都要释放连接以避免资源泄漏。

通过这种方式,你可以利用 mysql2 驱动程序来处理复杂的事务逻辑,并且支持中文字符集。


确定不支持事务?我怎么好像觉得是支持的

你的表的存储格式 选对了哇?

那个不是跟mysql用的存储引擎有关的么。。

找到这个。没用过。

node-mysql-transaction transaction wrapper for mysql driver

事务是支持的,使用mysql-queues 就可以了 下面是部分代码

var queues = require('mysql-queues');
const DEBUG = true;
queues(connection, DEBUG);
var trans = connection.startTransaction();

或者看这个帖子 http://cnodejs.org/topic/516fc02e6d38277306b29697

我参考的就是这个。https://github.com/joyent/node/wiki/modules#wiki-db-mysql 里面也是介绍说 mysql-queues 支持事务,但是不知道可以完美支持中文。。囧

Node.js 连接 MySQL 时,确实可以使用 node-mysql(也称为 mysql),但如果你需要更高级的功能如事务支持、连接池等,建议使用 mysql2mysql2node-mysql 的一个分支,它不仅支持中文完美支持,还提供了更丰富的功能。

示例代码

安装 mysql2

npm install mysql2

示例代码

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

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

    try {
        // 开启事务
        const [connection] = await pool.getConnection();
        await connection.query('START TRANSACTION');
        
        // 执行SQL语句
        await connection.query('INSERT INTO users (name, email) VALUES (?, ?)', ['Alice', 'alice@example.com']);
        await connection.query('INSERT INTO users (name, email) VALUES (?, ?)', ['Bob', 'bob@example.com']);
        
        // 提交事务
        await connection.query('COMMIT');
        console.log('Transaction committed successfully!');
    } catch (error) {
        // 回滚事务
        await connection.query('ROLLBACK');
        console.error('Transaction failed, rolled back:', error);
    } finally {
        // 释放连接
        if (connection) connection.release();
    }
}

main().catch(console.error);

解释

  1. 安装:首先通过 npm 安装 mysql2
  2. 创建连接池:使用 createPool 方法创建一个连接池,以管理数据库连接。
  3. 开启事务:通过 connection.query('START TRANSACTION') 开始一个新的事务。
  4. 执行SQL:执行插入语句。
  5. 提交或回滚:如果所有操作成功,则提交事务;如果遇到错误,则回滚事务。
  6. 释放连接:确保无论成功还是失败,都要释放连接。

这种方式可以确保数据的一致性和完整性,并且支持中文字符的处理。

回到顶部