道者编程

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设置

最新评论:
我要评论:

看不清楚