节点 - Mysql 如果一个查询失败,事务不会回滚
Node - Mysql Transaction is not rolling back if one query fails
我正在尝试执行总共有三个查询的节点-mysql 事务。这三个都是 'INSERT' 查询。我故意写错了第三个查询来测试回滚,但是事务正在为前两个查询成功地进入数据库。
我知道类似的问题已经被问过好几次了,我几乎都试过了,但没有成功
exports.registerNewUserTransaction = async (
res,
userToBeAdded,
nameToBeAdded,
emailToBeAdded) => {
const conn = await db.getConnection();
await conn.beginTransaction();
try {
await this.insertOne('user', userToBeAdded);
await this.insertOne('name', nameToBeAdded);
await this.insertOne('email', emailToBeAdded);
await conn.commit();
res.status(200);
} catch(err) {
await conn.rollback();
res.status(400);
} finally {
await conn.release();
}
};
如您所见,我正在从池中获取连接对象,开始事务并逐一执行查询。我的第三个查询有错误的列名,因此事务应该回滚但我看到前两个查询的条目。我真的很感激正确的方向。
节点版本:12.8.0
mysql(docker 中的运行):8.0.15
mysql(npm 版本):2.17.1
折腾了很久,终于想通了。答案如下:
exports.registerNewUserTransaction = async (
res,
userToBeAdded,
nameToBeAdded,
emailToBeAdded) => {
const conn = await db.getConnection();
// My first mistake was not to promisify connection query
conn.query = util.promisify(conn.query);
await conn.beginTransaction();
try {
// My second mistake was not to use same connection
await conn.query('INSERT INTO ...', userToBeAdded);
await conn.query('INSERT INTO ...', nameToBeAdded);
await conn.query('INSERT INTO ...', emailToBeAdded);
await conn.commit();
return res.status(200);
} catch(err) {
await conn.rollback();
return res.status(400);
} finally {
await conn.release();
}
};
希望这对某人有所帮助!
这是我错过的重要部分。
conn.query = util.promisify(conn.query);
我正在尝试执行总共有三个查询的节点-mysql 事务。这三个都是 'INSERT' 查询。我故意写错了第三个查询来测试回滚,但是事务正在为前两个查询成功地进入数据库。
我知道类似的问题已经被问过好几次了,我几乎都试过了,但没有成功
exports.registerNewUserTransaction = async (
res,
userToBeAdded,
nameToBeAdded,
emailToBeAdded) => {
const conn = await db.getConnection();
await conn.beginTransaction();
try {
await this.insertOne('user', userToBeAdded);
await this.insertOne('name', nameToBeAdded);
await this.insertOne('email', emailToBeAdded);
await conn.commit();
res.status(200);
} catch(err) {
await conn.rollback();
res.status(400);
} finally {
await conn.release();
}
};
如您所见,我正在从池中获取连接对象,开始事务并逐一执行查询。我的第三个查询有错误的列名,因此事务应该回滚但我看到前两个查询的条目。我真的很感激正确的方向。 节点版本:12.8.0 mysql(docker 中的运行):8.0.15 mysql(npm 版本):2.17.1
折腾了很久,终于想通了。答案如下:
exports.registerNewUserTransaction = async (
res,
userToBeAdded,
nameToBeAdded,
emailToBeAdded) => {
const conn = await db.getConnection();
// My first mistake was not to promisify connection query
conn.query = util.promisify(conn.query);
await conn.beginTransaction();
try {
// My second mistake was not to use same connection
await conn.query('INSERT INTO ...', userToBeAdded);
await conn.query('INSERT INTO ...', nameToBeAdded);
await conn.query('INSERT INTO ...', emailToBeAdded);
await conn.commit();
return res.status(200);
} catch(err) {
await conn.rollback();
return res.status(400);
} finally {
await conn.release();
}
};
希望这对某人有所帮助!
这是我错过的重要部分。 conn.query = util.promisify(conn.query);