Nodejs 使用node mysql startTransaction 时出现 commit with parameters undefined 错

Nodejs 使用node mysql startTransaction 时出现 commit with parameters undefined 错

大家好,本人新手 在使用mysql的事务时控制台一直报 commit with parameters undefined 最后 再来个maximun call stack size exceeded 已下是代码,什么都没干就用事务查询了下。

var mysql  = require('mysql');  
var connection = mysql.createConnection({  host : '**',  user : '**',  password : '**'  }); 
 connection.connect(); 
 var queues = require('mysql-queues'); 
const DEBUG = true; 
queues(connection, DEBUG);  
var trans = connection.startTransaction();
trans.query('SELECT * from dbgoods.tb_member', function(err, info) {
 if (err) 
{  
  console.log(123);
throw err;  trans.rollback();  }   
else {  
trans.commit(function(err, info) {  console.log(info);  });
 } 
 });
trans.execute();` console.log('execute');  connection.end();        

求高手解答


4 回复

你遇到的问题是因为你在使用 startTransaction 方法创建了一个事务对象 trans,但没有正确地使用它。你需要确保在事务中执行的所有 SQL 操作都通过事务对象进行,并且在事务完成后正确地调用 commitrollback

以下是修改后的代码示例:

var mysql = require('mysql');
var connection = mysql.createConnection({
    host: '**',
    user: '**',
    password: '**'
});

connection.connect();

// 创建一个事务
connection.beginTransaction(function(err) {
    if (err) {
        throw err;
    }

    // 在事务中执行查询
    connection.query('SELECT * FROM dbgoods.tb_member', function(err, results) {
        if (err) {
            // 如果有错误,回滚事务
            connection.rollback(function() {
                console.error('Transaction failed, rolling back.');
                throw err;
            });
        } else {
            // 如果没有错误,提交事务
            connection.commit(function(err) {
                if (err) {
                    // 如果提交失败,回滚事务
                    connection.rollback(function() {
                        console.error('Commit failed, rolling back.');
                        throw err;
                    });
                } else {
                    console.log('Transaction committed successfully.');
                    console.log(results);
                }
                // 结束连接
                connection.end();
            });
        }
    });
});

解释

  1. beginTransaction:

    • 使用 beginTransaction 方法开始一个新的事务。
    • 如果发生错误,则抛出异常并回滚事务。
  2. 查询:

    • 使用 connection.query 在事务中执行 SQL 查询。
    • 如果查询过程中发生错误,调用 connection.rollback 回滚事务。
  3. 提交:

    • 如果查询成功,调用 connection.commit 提交事务。
    • 如果提交过程中发生错误,再次调用 connection.rollback 回滚事务。
  4. 结束连接:

    • 无论事务成功还是失败,最后都要调用 connection.end() 关闭数据库连接。

这样可以确保事务中的所有操作都被正确处理,并且避免了你遇到的错误。


请把代码markdown排版一下,谢谢。

找到问题了,在事物还没触发返回事件的时候,程序就已经将连接中断了,得把连接中断语句写在事件返回方法里。

connection.end();

这个语句写在:

trans.commit(function(err, info) {
...
//写在这里
connection.end();
}

根据你提供的代码和遇到的问题,主要问题在于你错误地使用了 startTransactioncommit 方法。startTransaction 并不会返回一个可以直接执行查询的事务对象,而应该在你的查询语句中使用 connection 对象来管理事务。

正确的做法是,在需要开启事务的地方调用 connection.beginTransaction 方法,然后在查询语句中指定 connection 对象为事务的一部分。最后在事务完成后通过 connection.commitconnection.rollback 方法结束事务。

以下是修正后的代码示例:

var mysql = require('mysql');

// 创建数据库连接
var connection = mysql.createConnection({
    host: '**',
    user: '**',
    password: '**'
});

connection.connect();

// 开启事务
connection.beginTransaction(function(err) {
    if (err) {
        throw err;
    }

    // 在事务内执行查询
    connection.query('SELECT * from dbgoods.tb_member', function(err, results) {
        if (err) {
            // 如果出错,回滚事务
            return connection.rollback(function() {
                throw err;
            });
        }

        // 提交事务
        connection.commit(function(err) {
            if (err) {
                // 如果提交失败,回滚事务
                return connection.rollback(function() {
                    throw err;
                });
            }
            console.log('Transaction completed.');
        });
    });
});

console.log('execute');
connection.end();

这样修改后,你的事务处理逻辑将更符合 Node.js 的 MySQL 模块规范,并且能正确处理事务的提交或回滚。

回到顶部