You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js使用mysql2连接池时beginTransaction不是函数的问题求助

解决mysql2连接池下async/await事务调用报错问题

你遇到的is not a function错误,根源是事务必须基于单个数据库连接执行,而你直接调用连接池(con.promise())的beginTransaction方法——连接池本身并没有这个方法,只有单个连接对象才有。

下面是修改后的完整代码,核心是先从连接池获取单个连接,再基于这个连接做事务操作:

const mysql = require('mysql2');
const errorCodes = require('source/error-codes');
const PropertiesReader = require('properties-reader');

const prop = PropertiesReader('properties.properties');

const con = mysql.createPool({
    connectionLimit : 10,
    host: prop.get('server.host'),
    user: prop.get("server.username"),
    password: prop.get("server.password"),
    port: prop.get("server.port"),
    database: prop.get("server.dbname")
});

exports.checkInvestorBoost = async (event, context) => {
    context.callbackWaitsForEmptyEventLoop = false;
    con.config.namedPlaceholders = true;

    const params = event.queryStringParameters;

    if (!params || params.iduser == null) {
        return errorCodes.not_null_parameters;
    } 
    
    if(isNaN(params.iduser)) {
        return errorCodes.missing_fields;
    }

    const iduser = Number(params.iduser);
    const toDate = new Date();
    let connection;

    console.log("iduser: " + iduser);
    let sql = "SELECT * FROM golden_circle_member WHERE iduser= :iduser AND is_investor_boost = true AND to_date > :to_date";

    try {
        // 1. 从连接池获取单个连接
        connection = await con.promise().getConnection();
        // 2. 基于单个连接开启事务
        await connection.beginTransaction();
        
        const [data, meta] = await connection.query(sql, {
            iduser: iduser,
            to_date: toDate 
        });

        // 3. 提交事务
        await connection.commit();
        
        const output = data.length > 0;
        return {
            "statusCode": 200,
            "headers": {
              "Content-Type": "application/json"
            },
            "body": JSON.stringify({
                "is_investor_boost": output
            }),
            "isBase64Encoded": false
        };

    } catch (error) {
        console.log(error);
        // 出错时回滚事务
        if (connection) await connection.rollback();
        return errorCodes.internal_server_error;
    } finally {
        // 4. 无论成功失败,都释放连接回池
        if (connection) connection.release();
    }
};

关键改动说明

  • 新增let connection变量存储单个连接
  • 用await con.promise().getConnection()从连接池获取可用连接
  • 所有事务相关操作(beginTransaction、query、commit、rollback)都基于这个connection对象执行
  • 新增finally块确保连接一定会被释放,避免连接池耗尽
  • 错误处理中增加事务回滚逻辑,保证数据一致性

内容的提问来源于stack exchange,提问作者PeakGen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 06:06:24