Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java访问MongoDb锁定/解锁并发_Mongodb - Fatal编程技术网

Java访问MongoDb锁定/解锁并发

Java访问MongoDb锁定/解锁并发,mongodb,Mongodb,我读了一些文章,他们告诉我MongoDb本身有锁/解锁并发特性。例如,我有两个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

我读了一些文章,他们告诉我MongoDb本身有锁/解锁并发特性。例如,我有两个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)

写入操作在单个文档级别上是原子的:任何单个写入操作都不能原子地影响多个文档或多个集合

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

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

关于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);

无法锁定一个查询的结果,使其不被另一个进程修改。您可以在这些结果被“锁定”时将它们存储在另一个表中,并在写入之前检查这些值,但这听起来仍然像是一个竞赛条件的配方。或者你可以考虑使用类似的东西来设置一个标志在“锁定”记录,当你问他们。