7

Is in Mongo any way to do check and setting like atomic operation ? I am making booking for hotels and if there is free room you can reserve, but what if two or more people want to reserve in same time. Is there anything similar to transaction in Mongo or any way to solve this problem ?

4

3 回答 3

4

Yes, that's the classic use case for MongoDB's findAndModify command.

Specifically for pymongo: find_and_modify.

于 2012-08-16T16:43:15.200 回答
2

All updates are atomic operations over a document. Now find_and_modify locks that document and returns it back in the same operation. This allows you to combine a lock over the document during find and then applies the update operation.

You can find more about atomic operations: http://www.mongodb.org/display/DOCS/Atomic+Operations

Best,

Norberto

于 2012-08-16T17:24:39.953 回答
0

The answers reference findAndModify documentation. But a practical example given the OP's requirements will do justice:

const current = new ISODate();
const timeAgoBy30Minutes = new Date(current.getTime()  - 1000 * 30 ).toISOString();

db.runCommand(
  {
    findAndModify: "rooms",
    query: {
      "availability" : true,
      "lastChecked" : {
        "$lt": timeAgoBy30Minutes
      }
    },
    update: { $set: { availability: false, lastChecked:  current.toISOString() } }
  }
)

In the above example, my decision to use db.runCommand verses db.rooms.findAndModify was strategic. db.runCommand will return a status code as to whether the document was updated, which allows me to perform additional work if the return value was true. findAndModify simply returns the old document, unless the new flag is passed to the argument list by which it will return the updated document.

于 2020-03-04T20:28:26.583 回答