簡體   English   中英

ROLLBACK 不回滾事務 [NodeJS,MySQL]

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM