2012-07-16 92 views
0

我想執行node-mysql中的事務(通過執行查詢START TRANSACTION,ROLLBACK,COMMIT)。我有這段代碼:事務回滾後不執行查詢

conn.query("START TRANSACTION"); 
conn.query("INSERT INTO users (id, name, age) VALUES (1, 'Mat', '24')", function(e){ 
    if (e){ 
     conn.query("ROLLBACK", callback); 
    } 
    else{ 
     conn.query("COMMIT", callback); 
    } 
}); 

conn.query("INSERT INTO users (name, age) VALUES ('Mat', '24')", function(e, r){ 
    console.log(e); // null 
    console.log(r); // {fieldCount: 0, affectedRows: 1, insertId: 2, serverStatus: 3, warningCount: 0, message: ''} 
}); 

要測試回滾的情況下,我有意將id設置爲1,這會導致索引重複錯誤。事務回滾,但問題在於事務外部的第二次插入未執行。沒有錯誤記錄,並且 - 對我來說很奇怪 - 當我在第二次插入之後選擇整個表格時,結果中有新的一行。但在另一個連接中它消失了。所以它看起來像在連接結束時新創建的行被刪除。交易提交時不會出現問題。

回答

1

您的第二個INSERT INTO可以在您的ROLLBACK之前執行第一個INSERT INTO回調,因爲它在回調之外執行。當發生這種情況時,您的第二次插入也正在回滾,因爲您正在使用單個連接。將第二個插入內部的第一個插入到第一個的回調中以序列化事物。