Transactions in NoSQL?

前端 未结 11 961
长情又很酷
长情又很酷 2020-12-22 18:39

I\'m looking into NoSQL for scaling alternatives to a database. What do I do if I want transaction-based things that are sensitive to these kind of things?

11条回答
  •  既然无缘
    2020-12-22 19:11

    This is the closest answer I found which would apply to any NoSQL database. It's on a 2007 blog post from Adam Wiggins of Heroku.com:

    The old example of using a database transaction to wrap the transfer of money from one bank account to another is total bull. The correct solution is to store a list of ledger events (transfers between accounts) and show the current balance as a sum of the ledger. If you’re programming in a functional language (or thinking that way), this is obvious.

    From: http://adam.heroku.com/past/2007/12/17/a_world_without_sql/ (His website is great for ideas on scalability.)

    I interpreted the above paragraph as:

    1. Create a database for member accounts.
    2. Create a messaging queue. Nickname it "ledger".
    3. Add in background workers to fulfill each request in the queue.

    More info. on queues/background workers: http://adam.heroku.com/past/2009/4/14/building_a_queuebacked_feed_reader_part_1/

    The client (aka member or customer) follows these steps to take out money:

    1. Submit a request to take out money.
    2. Request is sent to server.
    3. Server places it in a queue. The message is: "Take out $5,000."
    4. Client is shown: "Please wait as request is being fulfilled..."
    5. Client machines polls server every 2 seconds asking, "Has the request been fulfilled?"
    6. On server, background workers are fulfilling previous requests from other members in first-in/first-out fashion. Eventually, they get to your client's request to take out money.
    7. Once request has been fulfilled, client is given a message with their new balance.

    You can use Heroku.com to create a small mock-up quickly if you are comfortable with Node.js or Ruby/Rack.

    The general idea seems pretty easy and much better than using transactions baked into the database that make it super-hard to scale.

    Disclaimer: I haven't implemented this in any way yet. I read about these things for curiosity even though I have no practical need for them. Yes, @gbn is right that a RDBMS with transactions would probably be sufficient for the needs of Timmy and me. Nevertheless, it would be fun to see how far you can take NoSQL databases with open-source tools and a how-to website called, "A Tornado of Razorblades".

提交回复
热议问题