Search code examples
meteor

How to implement transactions in Meteor Method calls


Suppose I have 2 collections "PlanSubscriptions" and "ClientActivations". I am serially doing a insert on both the collections.

Later one depends on previous one, if any of the transaction fails then the entire operation must rollback.

How can I achieve that in Meteor 1.4?


Solution

  • Well I figured it out myself.

    I added a package babrahams:transactions

    At server side Meteor Method call, I called tx Object that is globally exposed by the package. The overall Server Side Meteor.method({}) looks like below.

    import { Meteor } from 'meteor/meteor';
    import {PlanSubscriptions} from '/imports/api/plansubscriptions/plansubscriptions.js';
    import {ClientActivations} from '/imports/api/clientactivation/clientactivations.js';
    
    Meteor.methods({
        'createClientSubscription' (subscriptionData, clientActivationData) {
                var txid;
                try {
                txid = tx.start("Adding Subscription to our database");
    
                PlanSubscriptions.insert(subscriptionData, {tx: true})
    
                ClientActivations.insert(activation, {tx: true});
    
                tx.commit();
    
                return true;
            } catch(e){
                tx.undo(txid);
            }
            return false;
        }
    });
    

    With every insert I had added {tx : true}, this concluded it to be a apart of transaction.

    Server Console Output:

    I20170523-18:43:23.544(5.5)? Started "Adding Subscription to our database" with
    transaction_id: vdJQvFgtyZuWcinyF
    I20170523-18:43:23.547(5.5)? Pushed insert command to stack: vdJQvFgtyZuWcinyF
    I20170523-18:43:23.549(5.5)? Pushed insert command to stack: vdJQvFgtyZuWcinyF
    I20170523-18:43:23.551(5.5)? Beginning commit with transaction_id: vdJQvFgtyZuWcinyF
    I20170523-18:43:23.655(5.5)? Executed insert
    I20170523-18:43:23.666(5.5)? Executed insert
    I20170523-18:43:23.698(5.5)? Commit reset transaction manager to clean state
    

    For more Information you can goto link : https://github.com/JackAdams/meteor-transactions

    NOTE: I am using Meteor 1.4.4.2