我有一个mysql查询我试图使用一个使用事务的node-mysql。它应该在连接对象上,但我得到的错误说它没有开始事务方法。
TypeError: conn.beginTransaction is not a function
这是交易代码:
dbutil.transaction(req.db,
function(done){
req.db.query('INSERT INTO answers (question, user, background, importance, comment) values (?, ?, ?, ?, ?)',
[question, user, background, concurrence, importance, comment], function (err, result){
console.log('result from insert query: ', result);
console.error('error: ', err);
done();
// req.db.query('INSERT INTO concurrenceAnswers (concurrence) values (?)',
// [concurrence], function (err, result){
// console.log('result form insert query: ', result);
// console.error('error: ', err);
// })
});
}, function(){}
);
交易方法:
exports.transaction = function(conn, body, done) {
conn.beginTransaction(function(err) {
if (err) return done(err);
body(function(err) {
if (err) return conn.rollback(function() {
done(err);
});
conn.commit(function(err) {
if (err) return conn.rollback(function() {
done(err);
});
done();
});
});
});
};
Req.db.query是:
var db = mysql.createPool({
connectionLimit: config.db.connectionLimit,
host: config.db.host,
user: config.db.user,
password: config.db.password,
database: config.db.database,
port: config.db.port
});
答案 0 :(得分:4)
当您使用池时,首先需要从池中获取连接(您不能直接使用池来开始事务,就像您可以查询一样):
exports.transaction = function(connection, body, done) {
connection.getConnection(function(err, conn) {
conn.beginTransaction(function(err) {
if (err) return done(err);
body(function(err) {
if (err) return conn.rollback(function() {
done(err);
});
conn.commit(function(err) {
if (err) return conn.rollback(function() {
done(err);
});
done();
});
});
});
});
};