Transaction over two Tables with Postgres in Sails.js

Viewed 361

I am trying to implement a transaction in Node.js (Sails.js) with Postgresql and Sails Waterline.js ORM.

I tried to adapt this answer. In that answer we have only one table. In my problem I have 2 tables which have to be locked till the transaction is over.

What should this code do:

  • find User with :Id
  • if this User.coins > 0:
    • Update User.coins = 0
    • Create a new record in the table MyTransaction

But the snippet doesn't lock the transaction over both tables:

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);
  });
}

So when I run a loop(5times) in the frontend console, then it creates 5 records in the myTransaction table. How Can I do this properly?

0 Answers
Related