Node.js Sails.js中有Postgres的两个表上的事务

Node.js Sails.js中有Postgres的两个表上的事务,node.js,postgresql,transactions,sails.js,Node.js,Postgresql,Transactions,Sails.js,我试图用Postgresql和Sails Waterline.js ORM在Node.js(Sails.js)中实现一个事务 我试着适应这个。在这个答案中,我们只有一张桌子。在我的问题中,有两个表必须被锁定,直到事务结束 此代码应该做什么: 使用:Id查找用户 如果此User.coins>0: 更新User.coins=0 在表MyTransaction中创建新记录 但代码段不会在两个表上锁定事务: try { // Start the transaction sails.mod

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

我试着适应这个。在这个答案中,我们只有一张桌子。在我的问题中,有两个表必须被锁定,直到事务结束

此代码应该做什么:

  • 使用
    :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条记录。我怎样才能正确地做到这一点

我强烈建议您使用sequelize及其事务(DOCS>>)。我不知道(也没有文档)如何用sequelize替换Sails.js的核心部分Waterline.js。我已经听说了Sequelize,它听起来不错,但我不认为有办法在Sails中取代它。我的意思是,对于原始的postgres查询,它也必须是可能的。好吧,我看到Sails中有一个Sequelize的钩子,但是我必须重写一个包含超过12k代码行的整个项目;因为它是用水线写的。我需要一个与水线或postgresql查询解决方案。请参阅嵌入到您的问题中的链接。有一个更新,sails1.0如何支持事务。是的,但是我的项目应该是稳定的,我正在使用旧的sails。Sails 1.0仍然是测试版。