参考 > MongoDB CRUD操作 > 可重试写入
在本页面
3.6版的新功能。
可重试写入允许MongoDB驱动程序在遇到网络错误或在 副本集或分片群集中找不到正常的主操作时,一次自动重试某些写入操作。[1]
可重试写入具有以下要求:
客户端需要为MongoDB 3.6或更高版本更新的MongoDB驱动程序:
Java 3.6+ Python 3.6+ C 1.9以上 |
C#2.5以上 节点3.0+ Ruby2.5+ |
Perl 2.0以上 PHPC 1.4以上 Scala 2.2+ |
3.6
大于或等于,集群中每个节点的MongoDB版本必须大于或featureCompatibilityVersion
等于3.6
。有关标志的setFeatureCompatibilityVersion
更多信息,请参见
featureCompatibilityVersion
。0
是不重试。版本4.0中的新功能。
该交易提交和中止操作
是重试写操作。如果提交操作或中止操作遇到错误,则MongoDB驱动程序将重试该操作一次,无论是否retryWrites
将其设置为
false
。
事务的写操作不可单独重试,而不管其值是多少retryWrites
。
有关交易的更多信息,请参见交易。
需要与MongoDB 3.6和4.0兼容的官方驱动程序,包括retryWrites=true
在连接字符串中的选项才能
为该连接启用可重试的写入。
与MongoDB 4.2兼容的官方驱动程序默认情况下启用可重试写入。升级到需要兼容重写的4.2兼容驱动程序的应用程序可以忽略该retryWrites=true
选项。应用升级到需要的4.2兼容的驱动程序
禁用重试写操作必须包括
retryWrites=false
连接的字符串中。
mongo
贝壳要在mongo
外壳中启用可重试写入,请使用--retryWrites
命令行选项:
当发出已确认的写入问题时,以下写入操作可以重试;例如,写关注点
不能为。{w: 0}
注意
事务内的写操作不能单独重试。
方法 | 内容描述 |
---|---|
插入操作。 | |
单文档更新操作。[1] | |
单个文档删除操作。 | |
findAndModify 操作。所有findAndModify 操作都是单文档操作。 |
|
|
仅由单文档写操作组成的批量写操作。可重试的批量操作可以包括指定写操作的任何组合,但不能包括任何多文档写操作,例如updateMany 。 |
|
仅由单文档写操作组成的批量写操作。可重试批量操作可以包括指定的写操作的任何组合,但可以不包括任何多文档写操作,如update 指定true 的multi 选项。 |
分片键值更新
从MongoDB 4.2开始,您可以_id
通过以可重试写入或事务方式发布单文档update / findAndModify操作来更新文档的分片键值(除非分片键字段是不可变字段)。有关详细信息,请参见更改文档的分片键值。
[1] | (1,2) MongoDB 4.2将重试遇到重复密钥异常的某些单文档upsert(使用和更新)。有关条件,请参阅Upsert上的重复键错误。 在MongoDB 4.2之前,MongoDB不会重试遇到重复键错误的upsert操作。 |
如果驱动程序在目标副本集或分片的群集分片中找不到正常的主数据库,则驱动程序将等待
serverSelectionTimeoutMS
毫秒以确定新的主数据库,然后重试。可重试的写操作不能解决故障转移时间超过的实例serverSelectionTimeoutMS
。
警告
如果客户端应用程序暂时localLogicalSessionTimeoutMinutes
发出的响应时间比发出写操作后的响应时间更长,则有可能当客户端应用程序开始响应(不重新启动)时,可以重试并再次应用写操作。
仅当操作满足
以下所有条件时,MongoDB 4.2才会重试由于重复键错误而失败的单文档upsert操作(即和):upsert : true
multi : false
目标集合具有导致重复键错误的唯一索引。
更新匹配条件为:
单个相等谓词
{ "fieldA" : "valueA" }
,
要么
相等谓词的逻辑与
{ "fieldA" : "valueA", "fieldB" : "valueB" }
唯一索引键模式中的字段集与更新查询谓词中的字段集匹配。
更新操作不会修改查询谓词中的任何字段。
下表包含服务器可以或不能在重复键错误时重试的upsert操作示例:
唯一索引键模式 | 更新操作 | 可重试 |
---|---|---|
是 | ||
是 | ||
是 | ||
没有 查询谓词 |
||
没有 更新操作修改查询谓词中指定的字段。 |
||
没有 查询谓词字段( |
||
没有 这组查询谓词的字段( |
在MongoDB 4.2之前,MongoDB可重试写入不支持由于重复的键错误而导致失败的重试upsert。
local
数据库的可重试写入¶官方的MongoDB 4.2系列驱动程序默认情况下启用重试写入。除非明确禁止重试写入,否则写入local
数据库的应用程序在升级到4.2系列驱动程序时将遇到写入错误。
要禁用可重试写入,请retryWrites=false
在MongoDB集群的
连接字符串中指定
。