在Sails.js中使用Postgres对两个表进行事务

时间:2017-11-20 22:39:11

标签: node.js postgresql transactions sails.js

我正在尝试使用Postgresql和Sails Waterline.js ORM在Node.js(Sails.js)中实现一个事务。

我试图改编这个answer。在那个答案中,我们只有一个表。在我的问题中,我有2个表必须被锁定,直到交易结束。

这段代码应该做什么:

  • 找到:Id
  • 的用户
  • 如果User.coins > 0
    • 更新User.coins = 0
    • 在表格MyTransaction
    • 中创建新记录

但是该代码段并未锁定两个表上的事务:

try {
  // Start the transaction
  sails.models.user.query("BEGIN", function (err) {
    if (err) {
      throw new Error(err);
    }
    // Find the user
    sails.models.user.findOne(currentUser.id).exec(function (err, user) {
      if (err) {
        throw new Error(err);
      }
      if (user.coins > 0) {
        var params = {
          user_id: req.session.passport.user,
          publicAddress: bitcoin_address,
          amount: user.coins,
          wohnAdresse: wohnAdresse
        }
        // Update the user balance
        user.coins = 0;
        // Save the user
        user.save(function (err) {
          if (err) {
            throw new Error(err);
          }


            sails.models.myTransaction.create(params).exec(function (err, transaction) {
              if (err) {
                payout = {success: false};
                payout.transactionError = err;
                console.log("ROLLBACK! ROLLBACK!")
                return res.serverError(e);
              }
              // Commit the transaction
               sails.models.user.query("COMMIT", function (err) {
                 if (err) {
                   throw new Error(err);
                 }
                   payout = {success: true};
                   console.log("PAYOUT PAYOUT", payout);
                   console.log("PAYOUT PAYOUT", transaction);
                   return res.json(payout);
            });
          });
        });
      } // END of if user.coins>0
    });
  });
}
  // If there are any problems, roll back the transaction
catch (e) {
  User.query("ROLLBACK", function (err) {
    // The rollback failed--Catastrophic error!
    if (err) {
      return res.serverError(err);
    }
    // Return the error that resulted in the rollback
    return res.serverError(e);
  });
}

因此,当我在前端控制台中运行循环(5次)时,它会在myTransaction表中创建5条记录。我该怎么做呢?

0 个答案:

没有答案