【问题标题】:UPDATE SQL Query returning misleading response更新 SQL 查询返回误导性响应
【发布时间】:2016-11-22 19:31:18
【问题描述】:

我正在使用 nodejs 对数据库进行简单的 UPDATE SQL 查询,如下所示:

conn.query("UPDATE room SET `join_id`=? WHERE `id`=?", [join, cfid], function (e, r) {
    console.log(e, r);
    //e null; r object;
});

来自查询的响应 r 返回以下内容:

OkPacket {                                                                                                                                
  fieldCount: 0,                                                                                                                               
  affectedRows: 1,                                                                                                                             
  insertId: 0,                                                                                                                                 
  serverStatus: 34,                                                                                                                            
  warningCount: 0,                                                                                                                             
  message: '(Rows matched: 1  Changed: 1  Warnings: 0',                                                                                        
  protocol41: true,                                                                                                                            
  changedRows: 1 
} 

OKPacket 响应之后,我发现数据库没有任何变化,因此我的其余代码出现故障。我花了几个小时研究这个问题,发现两年前的一个问题还没有结束:here

【问题讨论】:

  • 您是否开启了交易?
  • 什么是交易?
  • 如果您对数据库进行的多项更改必须全部成功或全部失败,则首先启动事务。如果在某个时候出现故障,事务将“回滚”以避免不一致。如果一切成功,您的事务将“提交”以保存更改。见START TRANSACTION, COMMIT, and ROLLBACK Syntax

标签: mysql node.js


【解决方案1】:

我的猜测是您关闭了自动提交,可能是在 MySQL 服务器的 my.cnf 文件或其他方式中。要检查,请按照以下行运行代码:

let sql = "SHOW GLOBAL variables LIKE 'autocommit'";
connection.query(sql, function(err, result) {
  console.log(result, 'global');
});

let sql2 = "SHOW variables LIKE 'autocommit'";
connection.query(sql2, function(err, result) {
  console.log(result, 'local');
});

你的控制台应该输出

[ RowDataPacket { Variable_name: 'autocommit', Value: 'ON' } ] 'global'
[ RowDataPacket { Variable_name: 'autocommit', Value: 'ON' } ] 'local'

但如果自动提交为“关闭”,您就有答案了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-29
    • 1970-01-01
    • 2018-10-21
    • 2014-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多