MySQL2查询结果莫名缺失一行,嵌套查询回调才返回完整结果求解释
MySQL查询结果缺失一行的原因分析
问题重现
执行SELECT查询时结果莫名缺失一行:
- 单独调用
getOrders(),查询结果会少一行 - 在
getQueueTime的回调函数中调用getOrders(),能返回完整结果
相关简化代码如下:
getQueueTime函数
function getQueueTime(callback) { const sql = "SELECT SUM(queue_time) AS total_queue_time FROM Orders WHERE order_status = 'Processing'" pool.getConnection((err, connection) => { connection.query(sql, (error, results) => { connection.release(); let queue_time = results[0].total_queue_time; callback(queue_time); }); }); }
getOrders函数
function getOrders(status) { return new Promise((resolve, reject) => { const sql = "SELECT * FROM Orders AS o JOIN OrderItems AS oi ON o.order_id = oi.order_id JOIN Food AS f on oi.food_id = f.food_id WHERE o.order_status = 'Processing'"; connection.getConnection((err, connection) => { connection.query(sql, (error, results) => { console.log(results); connection.release(); resolve(results); //此处为涉及的查询结果 //其余逻辑 }) }) }) }
可能的原因分析
连接来源不一致:
getQueueTime使用pool.getConnection从连接池获取连接,而getOrders直接调用connection.getConnection(此处connection疑似全局变量而非连接池实例)。两者使用不同的数据库连接会话,全局连接可能残留特殊会话设置(比如事务隔离级别、sql_mode参数),导致JOIN查询过滤掉一行数据。事务提交时机差异:若缺失的行是刚插入的数据,单独调用
getOrders时,插入操作的事务尚未提交;而getQueueTime的查询可能触发了连接池回收连接时的自动提交,或使用了已提交事务的连接,因此能读到完整数据。连接池状态残留:连接池中的连接可能保留了之前会话的状态(比如未关闭的事务、临时表、会话变量)。
getQueueTime使用的连接状态正常,而getOrders复用的连接存在未处理事务,导致查询结果不一致。JOIN关联数据的提交状态:检查缺失行对应的
Orders是否存在关联的OrderItems或Food记录。单独调用时,若关联数据处于未提交状态,会被JOIN逻辑过滤;回调中调用时,关联数据已完成提交,因此能被查询到。
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

