私は、UPDATEを最初に実行した後にUNIQUEキー制約に違反するINSERTを実行して、アプリケーション内のnode-mysqlトランザクションをテストしています。 INSERTが失敗している間、ROLLBACKとのトランザクションにもかかわらず、最初のUPDATEが成功しています。 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で非同期/待機を正式にサポートするまで、ネストされたバージョンに固執すると思います。これにより、約束を使用して学習し、練習する時間が与えられます。 – littleK