0

我想知道 Mongo 默认是如何写入磁盘的。异步还是同步?

当我做:

$collection->insert(array("a" => 42));

是同步的吗?文档说参数默认w设置为1,这应该导致只有在数据写入磁盘时才insert返回。与(未确认)相反,数据实际上是以异步方式写入的(即发即弃)。w => 0

所以我的问题是

  1. 谁能证实我上面的观察?
  2. 在我看来,只有在同步模式()下insert才会抛出,对吗?MongoCursorExceptionw => 1
4

1 回答 1

3

你的假设是正确的。

因为无论如何我都在编写mondodb单元测试,所以我把它放在一起来测试它。

public function testWriteConcern()
{
    $mongo = new MongoClient("mongodb://localhost/");

    $db = $mongo->test;
    $collection = $db->test;
    $collection->remove();
    $collection->insert(array("_id"=>"unique"));
    try {
        $collection->insert(array("_id"=>"unique"));
        $this->fail("Expected duplicate key exception (w=1)");
    }
    catch (MongoCursorException $e) {}

    try {
        $collection->insert(array("_id"=>"unique"), array("w" => 0));
        $this->fail("Expected duplicate key exception (w=0)");
    }
    catch (MongoCursorException $e) {}  

    $db->drop();
    $mongo->close();
}

如您所料,当写入关注点设置为 0 时,不会引发 MongoCursorException。

There was 1 failure:

1) MongoDBTest::testWriteConcern
Expected duplicate key exception (w=0)

FAILURES!
Tests: 1, Assertions: 0, Failures: 1.
于 2013-11-06T15:00:09.307 回答