我想知道 Mongo 默认是如何写入磁盘的。异步还是同步?
当我做:
$collection->insert(array("a" => 42));
是同步的吗?文档说参数默认w
设置为1
,这应该导致只有在数据写入磁盘时才insert
返回。与(未确认)相反,数据实际上是以异步方式写入的(即发即弃)。w => 0
所以我的问题是
- 谁能证实我上面的观察?
- 在我看来,只有在同步模式()下
insert
才会抛出,对吗?MongoCursorException
w => 1
你的假设是正确的。
因为无论如何我都在编写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.