nodejs mysql2 事务处理函数,不用async/await 完整代码
时间: 2024-10-16 09:19:05 浏览: 46
在Node.js中,`mysql2`库通常用于操作MySQL数据库。要进行非异步(同步)的事务处理,你可以使用`mysql2`提供的`.startTransaction()`、`.commit()`和`.rollback()`方法。但由于`mysql2`本身并不直接支持同步回调的方式,我们需要借助`bluebird`或者其他Promise库来实现类似的效果。这里是一个示例:
```javascript
const mysql = require('mysql2');
const Bluebird = require('bluebird'); // 引入Promise库
// 创建连接池
const pool = mysql.createPool({
host: 'your_host',
user: 'your_user',
password: 'your_password',
database: 'your_database'
});
Bluebird.promisifyAll(pool); // 将pool的所有方法转化为Promise形式
function runNonAsyncTransaction(callback) {
try {
// 开始事务
const connection = await pool.startTransaction();
// 执行SQL(假设这是你的业务逻辑)
const result = await connection.query(
`BEGIN; INSERT INTO your_table (column1, column2) VALUES (?, ?); UPDATE another_table SET column3 = ? WHERE id = ?`,
[value1, value2, value3, id]
);
// 如果所有操作成功,则提交事务
if (result.affectedRows > 0) {
await connection.commit();
callback(null, "Transaction committed");
} else {
// 提交失败,回滚事务
await connection.rollback();
callback(new Error("Transaction failed"), null);
}
} catch (error) {
// 捕获错误并回滚事务
await connection.rollback();
callback(error, null);
} finally {
// 关闭连接
if (connection && !connection._enqueueing) {
connection.release(); // 这里假设connection没有其他等待队列
}
}
}
// 使用示例
runNonAsyncTransaction((err, result) => {
if (err) console.error(err);
else console.log(result);
});
```
注意,由于Node.js event loop的特性,尽管这里的代码看起来像是同步的,但它实际上是在异步上下文中运行的。`callback`函数会在事务结束时被调用。
阅读全文