错误与资源释放要点
- 转账这类多步操作必须包事务,beginTransaction 到 commit
- 出错走 rollback 回滚,保证两步要么都成要么都废
- 无论成功失败,finally 里都要 conn.release() 还回连接池
- 不释放连接,池子很快被打满,新请求全部卡住
- 捕获 err.code 区分错误:ER_DUP_ENTRY 是主键冲突
- ECONNREFUSED 说明库没起或地址错,先查网络再查代码
错误与资源释放示例
async function transfer(fromId, toId, amount) {
const conn = await promisePool.getConnection();
try {
await conn.beginTransaction();
await conn.query('UPDATE account SET balance = balance - ? WHERE id = ?', [amount, fromId]);
await conn.query('UPDATE account SET balance = balance + ? WHERE id = ?', [amount, toId]);
await conn.commit();
console.log('转账成功');
} catch (e) {
await conn.rollback();
console.error('转账失败,已回滚:', e.message);
} finally {
conn.release();
}
}
避坑提醒:把 getConnection 拿到连接写进 try,release 写进 finally,是 Node 连库最稳的模板,记死这个骨架。