[英]ROLLBACK doesn't rollback transaction [NodeJS, MySQL]
connection.query(`START TRANSACTION;`, async function (err) {
if (err) {
req.flash("flash", "Something went wrong while deleting. Try again.");
return res.redirect("back");
} else {
await connection.query(
`INSERT INTO... ; SELECT LAST_INSERT_ID();`,
async (error, results1) => {
if (error) {
await connection.query(`ROLLBACK;`, function (err) {
req.flash("flash", "There was an error while posting.");
return res.redirect("/post");
});
} else {
var post_id = await results1[0].insertId;
await connection.query(
`INSERT INTO...`,
[],
async (error, results) => {
if (error) {
await connection.query(`ROLLBACK;`, function (err) {
req.flash("flash", "There was an error while posting.");
return res.redirect("/post");
});
} else {
await connection.query(
`INSERT INTO...`,
async (error, results) => {
if (error) {
await connection.query(`ROLLBACK;`, function (err) {
req.flash("flash", "There was an error while posting.");
return res.redirect("/post");
});
}
await connection.query(`ROLLBACK;`, function(err){
req.flash("flash", "Went through...");
return res.redirect("back");
})
...
});
首先我開始交易。 然后我在中間有代碼將數據插入到 3 個表中。 我想測試回滾,它應該在 START TRANSACTION 之后撤消所有操作,但它沒有做任何事情。 我做錯了什么?
(代碼本身可以工作,所以如果我放錯了任何括號,請忽略)。
問題是我直接使用了一個池。 您需要獲得一個新連接,然后使用它來進行所有查詢和事務。 這也是 beginTransaction 之前對我不起作用的原因。 我應該做的是:
connection.getConnection(function(err, con) {
con.query...
con.beginTransaction()...
con.query..
con.rollback()...
})
您可以查看多事務管理器庫來管理您的事務。
https://www.npmjs.com/package/@multiple-transaction-manager/mysql
例子;
// init manager & context
const txnMngr: MultiTxnMngr = new MultiTxnMngr();
const mysqlContext = new MysqlDBContext(txnMngr, pool);
// Add first step
mysqlContext.addTask("DELETE FROM test_table");
// Add second step
mysqlContext.addTask("INSERT INTO test_table(id, name) VALUES (:id, :name)", { "id": 1, "name": "Dave" });
// Add third step
mysqlContext.addTask("INSERT INTO test_table(id, name) VALUES (:id, :name)", { "id": 2, "name": "Kevin" });
// jest test
await expect(txnMngr.exec()).resolves.not.toBeNull();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.