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();
求高手解答
你遇到的问题是因为你在使用 startTransaction
方法创建了一个事务对象 trans
,但没有正确地使用它。你需要确保在事务中执行的所有 SQL 操作都通过事务对象进行,并且在事务完成后正确地调用 commit
或 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) {
// 如果有错误,回滚事务
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();
});
}
});
});
解释
-
beginTransaction:
- 使用
beginTransaction
方法开始一个新的事务。 - 如果发生错误,则抛出异常并回滚事务。
- 使用
-
查询:
- 使用
connection.query
在事务中执行 SQL 查询。 - 如果查询过程中发生错误,调用
connection.rollback
回滚事务。
- 使用
-
提交:
- 如果查询成功,调用
connection.commit
提交事务。 - 如果提交过程中发生错误,再次调用
connection.rollback
回滚事务。
- 如果查询成功,调用
-
结束连接:
- 无论事务成功还是失败,最后都要调用
connection.end()
关闭数据库连接。
- 无论事务成功还是失败,最后都要调用
这样可以确保事务中的所有操作都被正确处理,并且避免了你遇到的错误。
请把代码markdown排版一下,谢谢。
找到问题了,在事物还没触发返回事件的时候,程序就已经将连接中断了,得把连接中断语句写在事件返回方法里。
connection.end();
这个语句写在:
trans.commit(function(err, info) {
...
//写在这里
connection.end();
}
根据你提供的代码和遇到的问题,主要问题在于你错误地使用了 startTransaction
和 commit
方法。startTransaction
并不会返回一个可以直接执行查询的事务对象,而应该在你的查询语句中使用 connection
对象来管理事务。
正确的做法是,在需要开启事务的地方调用 connection.beginTransaction
方法,然后在查询语句中指定 connection
对象为事务的一部分。最后在事务完成后通过 connection.commit
或 connection.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 模块规范,并且能正确处理事务的提交或回滚。