Saturday, December 2, 2017

Transaction over two Tables with Postgres in Sails.js

Leave a Comment

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

If You Enjoyed This, Take 5 Seconds To Share It

0 comments:

Post a Comment