mongodb WriteConcern用法
格式:
{ w: <value>, j: <boolean>, wtimeout: <number> }以下转自:https://blog.csdn.net/leshami/article/details/52913705
w : 该选项要求确认操作已经传播到指定数量的mongod实例或指定标签的mongod实例
w可选的的值
w:1(应答式写入)
要求确认操作已经传播到指定的单个mongod实例或副本集主实例(缺省为1)
w:0(非应答式写入)
不返回任何响应,所以无法知道写入是否成功
但是对于尝试向已关闭的套接字写入或者网络故障会返回异常信息
w:>1(用于副本集环境)
该值用于设定写入节点的数目,包括主节点
"majority"(大多数)
适用于集群架构,要求写入操作已经传递到绝大多数投票节点以及主节点后进行应答
要求写入操作已经传递到指定tag标记副本集中的成员后进行应答
j : 该选项要求确认写操作已经写入journal日志之后应答客户端(需要开启journal功能)
则在意外重启,宕机等情形下可以通过journal来进行数据恢复
写入journal操作必须等待直到下次提交日志时完成写入
为降低延迟,MongoDB可以通过增加commit journal的频率来加快journal写入
wtimeout:
该选项指定一个时间限制,以防止写操作无限制被阻塞导致无法应答给客户端
wtimeout的单位为ms,当w值大于1时生效,该参数即仅适用于集群环境
当某个节点写入时超出指定wtimeout之后,mongod将返回一个错误
在捕获到超时之前,mongod并不会撤销其他节点已成功完成的写入
wtimeout值为0时等同于没有配置wtimeout选项,容易导致由于某个节点挂起而无法应答
对于单实例应答的情形,是将数据写入到内存后开始应答,除非j:true,则保证掉电后不会丢失数据 更多参考文档:
https://docs.mongodb.com/manual/reference/write-concern/#write-concern-acknowledged
http://www.ywnds.com/?p=3688
PHP7用法:
$manager = new MongoDB\Driver\Manager('mongodb://root:123@10.10.10.104:27017');MAJORITY方式:$bulk = new MongoDB\Driver\BulkWrite; //默认是有序的,串行执行
$bulk->update(
['user_id' => 2],
['$set'=>['real_name'=>'中国我的国']
]);
$writeConcern= new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//确认,MAJORITY 1000毫秒
$manager->executeBulkWrite('location.box', $bulk,$writeConcern); db.box.insert({"user_id":2,"real_name":"lijie"},{writeConcern:{w:"majority",j:1,wtimeout:1000}}) 其他方式:
final public MongoDB\Driver\WriteConcern::__construct ( string|integer $w [, int $wtimeout [, bool $journal ]] )
$writeConcern = new MongoDB\Driver\WriteConcern(1, 1000, true);
$manager->executeBulkWrite('location.box', $bulk,$writeConcern);
print_r($writeConcern->bsonSerialize());exit; //打印concern设置这里输出:
| stdClass Object | |
| ( | |
| [w] => 1 | |
| [j] => 1 | |
| [wtimeout] => 1000 | |
| ) | |
db.box.insert({"user_id":2,"real_name":"lijie"},{writeConcern:{w:1,j:1,wtimeout:1000}}) db.things.insert({dd:123},{writeconcern:{w:2}})是设置当前插入的SQL的writeconcern;
db.setWriteConcern({w:1,wtimeout:3000,j:1})是设置当前的db的writeconcern值;
db.getWriteConcern()是获取当前db的write concern设置