我在執行UPDATE之後,通過執行INSERT來檢測我的應用程序中的node-mysql事務,這將違反UNIQUE鍵約束。雖然INSERT失敗,但我發現最初的UPDATE成功了,儘管使用ROLLBACK的事務是成功的。 MySQL UPDATE不執行隱式提交,所以我不確定這裏究竟發生了什麼。在唯一鍵違規後,node-mysql事務未回滾
pool.getConnection(function (err, connection) {
connection.beginTransaction(function (err) {
if (err) {
console.log(" --- error 1: " + JSON.stringify(err));
}
console.log(" --- A");
connection.query('update course_person set rescheduled_date = CURDATE() where idperson = ? and rescheduled_date is null', [idperson], function (err, rows, fields) {
if (err) {
connection.rollback(function() {
console.log(" --- error 2: " + JSON.stringify(err));
});
console.log(" --- B");
}
console.log(" --- C");
});
connection.query('insert into course_person (idcourse, idperson) VALUES (?, ?)', [newidcourse, idperson], function (err, rows, fields) {
if (err) {
connection.rollback(function() {
console.log(" --- error 3: " + JSON.stringify(err));
});
console.log(" --- D");
}
console.log(" --- E");
});
connection.commit(function (err) {
if (err) {
connection.rollback(function() {
console.log(" --- error 4: " + JSON.stringify(err));
});
console.log(" --- F");
}
console.log(" --- G");
req.flash('success', 'Person was updated successfully.');
res.redirect('/person/' + idperson);
connection.release();
});
});
});
我得到下面的輸出順序:
--- A
--- C
--- D
--- E
--- G
--- error 3: {"code":"ER_DUP_ENTRY","errno":1062,"sqlState":"23000","index":0}
,這裏是我的證明:)
非常感謝,特別是對於這些例子!我認爲它必須是異步相關的東西。我認爲我現在要堅持使用嵌套版本,至少直到節點在版本8中正式支持異步/等待。這也會給我一些時間來學習和練習使用promise。 – littleK