2016-11-22 67 views
0

我做一個簡單的UPDATE SQL查詢到使用的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

+1

您是否打開了交易記錄? – Dave

+0

什麼是交易? – Monstrum

+0

如果您對必須全部成功或全部失敗的數據庫進行了若干更改,則首先啓動事務。如果在某個時候出現故障,交易將「回滾」以避免不一致。如果一切順利,您的交易「承諾」保存更改。請參閱[START TRANSACTION,COMMIT和ROLLBACK語法](http://dev.mysql.com/doc/refman/5.7/en/commit.html) – Dave

回答

0

我的猜測是你有autocommit關閉,也許在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' 

但如果是自動提交「OFF」,你有你的答案。