Mongoose.js transactions

前端 未结 6 1012
栀梦
栀梦 2021-01-30 18:14

I know MongoDB doesn\'t support transactions as relational databases do, but I still wonder how to achieve atomicity for several operations. Hunting around the web, I see people

6条回答
  •  野趣味
    野趣味 (楼主)
    2021-01-30 18:21

    This question is quite old but for anyone who stumbles upon this page, you could use fawn. It's an npm package that solves this exact problem. Disclosure: I wrote it

    Say you have two bank accounts, one belongs to John Smith and the other belongs to Broke Individual. You would like to transfer $20 from John Smith to Broke Individual. Assuming all first name and last name pairs are unique, this might look like:

    var Fawn = require("fawn");
    var task = Fawn.Task()
    
    //assuming "Accounts" is the Accounts collection 
    task.update("Accounts", {firstName: "John", lastName: "Smith"}, {$inc: {balance: -20}})
      .update("Accounts", {firstName: "Broke", lastName: "Individual"}, {$inc: {balance: 20}})
      .run()
      .then(function(){
        //update is complete 
      })
      .catch(function(err){
        // Everything has been rolled back. 
    
        //log the error which caused the failure 
        console.log(err);
      });
    

    Caveat: tasks are currently not isolated(working on that) so, technically, it's possible for two tasks to retrieve and edit the same document just because that's how MongoDB works.

    It's really just a generic implementation of the two phase commit example on the tutorial site: https://docs.mongodb.com/manual/tutorial/perform-two-phase-commits/

提交回复
热议问题