对MongoDb的Java访问锁定/解锁并发

时间:2014-03-18 17:26:22

标签: mongodb

我阅读了一些文章,他们告诉我MongoDb本身具有锁定/解锁并发功能。例如,我有2个Java实例访问一个MongoDb来读取&更新数据,每个数据都做同样的事情:

1. Query all the qualified data from MongoDb  [read]
   (using DBCursor cursor = collection.find(query))
2. Do some calculation and update/write back to MongoDb (maybe all of them or 
   one of them) [write]

我想确保从MongoDb查询的所有合格数据都应该“锁定”,因为它们可能会在以后更新/更改;如果另一个Java实例同时访问相同的数据,它将返回错误的结果。因此,在更新/写入过程完成之前,所有这些实例必须同时仅由一个实例访问(步骤2)。

MongoDb如何处理上述情况?它是否有一些功能可以自动实现它或者我必须手动执行它(使用其他应用程序,如zookeeper)?

1 个答案:

答案 0 :(得分:0)

写操作在单个文档的级别上是原子的:没有一个写操作可以原子地影响多个文档或多个集合。

当单个写操作修改多个文档时,整个操作不是原子操作,其他操作可能交错。即使写操作修改了单个记录中的多个子文档,对单个文档或记录的修改也始终是原子的。

没有其他行动是原子的;但是,您可以使用隔离运算符隔离影响多个文档的单个写操作。

MongoDB has some buried documentation on isolating sequences of operations

就java驱动程序而言,这是一个关于如何在Java中实现原子操作的简单示例

Mongo mongo = new Mongo("localhost", 27017);
DB database = mongo.getDB("mydb");
DBCollection collection = database.getCollection("testCollection");
// create a simple db object where counter value is 0
DBObject temp = new BasicDBObject("name", "someName").append("counter", 0);
// insert it into the collection
collection.insert(temp);
// create an increment query
DBObject modifier = new BasicDBObject("counter", 1);
DBObject incQuery = new BasicDBObject("$inc", modifier);
// create a search query
DBObject searchQuery = new BasicDBObject("name", "someName");
// increment a counter value atomically
WriteResult upRes = collection.update(searchQuery, incQuery);