On this page本页内容
Retryable writes allow MongoDB drivers to automatically retry certain write operations a single time if they encounter network errors, or if they cannot find a healthy primary in the replica set or sharded cluster. 可重试写入允许MongoDB驱动程序在遇到网络错误或在副本集或分片集群中找不到健康的主节点时自动重试某些写入操作。[1]
Retryable writes have the following requirements:可重试写入具有以下要求:
Clients require MongoDB drivers updated for MongoDB 3.6 or greater:客户端需要为MongoDB 3.6或更高版本更新MongoDB驱动程序:
Java 3.6+ Python 3.6+ C 1.9+ Go 1.8+ | C# 2.5+ Node 3.0+ Ruby 2.5+ Rust 2.1+ Swift 1.2+ | Perl 2.0+ PHPC 1.4+ Scala 2.2+ C++ 3.6.6+ |
3.6
or greater, and the featureCompatibilityVersion
of each node in the cluster must be 3.6
or greater. 3.6
或更高版本,群集中各个节点的featureCompatibilityVersion
必须为3.6
或更大版本。setFeatureCompatibilityVersion
for more information on the featureCompatibilityVersion
flag.featureCompatibilityVersion
标志的更多信息,请参阅setFeatureCompatibilityVersion
。0
are not retryable.0
的写入操作不可重试。New in version 4.0.在版本4.0中新增。
The transaction commit and abort operations are retryable write operations. 事务提交和中止操作是可重试的写操作。If the commit operation or the abort operation encounters an error, MongoDB drivers retry the operation a single time regardless of whether 如果提交操作或中止操作遇到错误,MongoDB驱动程序将重试该操作一次,而不管retryWrites
is set to false
.retryWrites
是否设置为false
。
The write operations inside the transaction are not individually retryable, regardless of value of 无论retryWrites
.retryWrites
的值如何,事务中的写入操作都不可单独检索。
For more information on transactions, see Transactions.有关事务的更多信息,请参阅事务。
retryWrites=true
option. retryWrites=true
选项。retryWrites=true
option can be omitted in applications that use drivers compatible with MongoDB 4.2 and higher.retryWrites=true
选项。retryWrites=false
in the connection string.retryWrites=false
。mongosh
Retryable writes are enabled by default in mongosh
. mongosh
中默认启用可重试写入。To disable retryable writes, use the 要禁用可重试写入,请使用--retryWrites=false
command line option:--retryWrites=false
命令行选项:
mongosh --retryWrites=false
mongo
Retryable writes are disabled by default in the legacy 在传统mongo
shell. mongo
shell中,默认情况下禁用可重试写入。To enable retryable writes, use the 要启用可重试写入,请使用--retryWrites=true
command line option:--retryWrites=true
命令行选项:
mongo --retryWrites=true
The following write operations are retryable when issued with acknowledged write concern; e.g., Write Concern cannot be 当发出确认的写入问题时,可重试以下写入操作:;例如,写入关注点不能为{w: 0}
.{w: 0}
。
The write operations inside the transactions are not individually retryable.事务中的写入操作不可单独检索。
findAndModify findAndModify operations are single document operations.findAndModify 操作都是单文档操作。
| |
| updateMany .updateMany 。
|
| update which specifies true for the multi option.multi 选项指定true 的更新。
|
Starting in MongoDB 4.2, you can update a document's shard key value (unless the shard key field is the immutable 从MongoDB 4.2开始,您可以通过以可重试写入或在事务中发出单个文档更新/查找和修改操作来更新文档的分片键值(除非分片键值字段是不可变的_id
field) by issuing single-document update/findAndModify operations either as a retryable write or in a transaction. _id
字段)。For details, see Change a Document's Shard Key Value.有关详细信息,请参阅更改文档的分片键值。
[1] | (1, 2) upsert: true and multi: false ) that encounter a duplicate key exception. upsert:true 和multi:false )。 |
MongoDB retryable writes make only one retry attempt. MongoDB可重试写入只进行一次重试尝试。This helps address transient network errors and replica set elections, but not persistent network errors.这有助于解决暂时性网络错误和副本集选举,但不能解决持久性网络错误。
If the driver cannot find a healthy primary in the destination replica set or sharded cluster shard, the drivers wait 如果驱动程序在目标副本集或分片群集分片中找不到健康的主设备,则驱动程序将等待serverSelectionTimeoutMS
milliseconds to determine the new primary before retrying. serverSelectionTimeoutMS
毫秒以确定新的主设备然后重试。Retryable writes do not address instances where the failover period exceeds 可重试写入不会处理故障切换周期超过serverSelectionTimeoutMS
.serverSelectionTimeoutMS
的实例。
If the client application becomes temporarily unresponsive for more than the 如果客户端应用程序在发出写操作后暂时无响应超过localLogicalSessionTimeoutMinutes
after issuing a write operation, there is a chance that when the client applications starts responding (without a restart), the write operation may be retried and applied again.localLogicalSessionTimeoutMinutes
,则当客户端应用程序开始响应(无需重新启动)时,可能会重试并再次应用写操作。
MongoDB 4.2 will retry single-document upsert operations (i.e MongoDB 4.2将重试由于重复密钥错误而失败的单文档upsert操作(即upsert : true
and multi : false
) that fail due to a duplicate key error only if the operation meets all of the following conditions:upsert:true
和multi:false
),前提是该操作满足以下所有条件:
The update match condition is either:更新匹配条件为:
A single equality predicate单个相等谓词
{ "fieldA" : "valueA" }
,
or
a logical AND of equality predicates等式谓词的逻辑与
{ "fieldA" : "valueA", "fieldB" : "valueB" }
The following table contains examples of upsert operations that the server can or cannot retry on a duplicate key error:下表包含服务器可以或不能重试重复密钥错误的upsert操作示例:
{ _id : 1 } | db.collName.updateOne( { _id : ObjectId("1aa1c1efb123f14aaa167aaa") }, { $set : { fieldA : 25 } }, { upsert : true } ) | Yes |
{ fieldA : 1 } | db.collName.updateOne( { fieldA : { $in : [ 25 ] } }, { $set : { fieldB : "someValue" } }, { upsert : true } ) | Yes |
{ fieldA : 1, fieldB : 1 } | db.collName.updateOne( { fieldA : 25, fieldB : "someValue" }, { $set : { fieldC : false } }, { upsert : true } ) | Yes |
{ fieldA : 1 } | db.collName.updateOne( { fieldA : { $lte : 25 } }, { $set : { fieldC : true } }, { upsert : true } ) | No
|
{ fieldA : 1 } | db.collName.updateOne( { fieldA : { $in : [ 25 ] } }, { $set : { fieldA : 20 } }, { upsert : true } ) | No
|
{ _id : 1 } | db.collName.updateOne( { fieldA : { $in : [ 25 ] } }, { $set : { fieldA : 20 } }, { upsert : true } ) | No
|
{ fieldA : 1 } | db.collName.updateOne( { fieldA : 25, fieldC : true }, { $set : { fieldD : false } }, { upsert : true } ) | No
|
Prior to MongoDB 4.2, MongoDB retryable writes did not support retrying upserts which failed due to duplicate key errors.在MongoDB 4.2之前,MongoDB可重试写入不支持重试因重复密钥错误而失败的升级。
The serverStatus
command, and its mongosh
shell helper db.serverStatus()
includes statistics on retryable writes in the transactions
section.serverStatus
命令及其mongosh
shell助手db.serverStatus()
在transactions
部分中包含关于可重试写入的统计信息。
local
Databaselocal
数据库的可重试写入The official MongoDB 4.2-series drivers enable retryable writes by default. 官方MongoDB 4.2系列驱动程序默认启用可重试写入。Applications which write to the 写入local
database will encounter write errors upon upgrading to 4.2-series drivers unless retryable writes are explicitly disabled.local
数据库的应用程序在升级到4.2系列驱动程序时将遇到写入错误,除非显式禁用可重试写入。
To disable retryable writes, specify 要禁用可重试写入,请在MongoDB集群的连接字符串中指定retryWrites=false
in the connection string for the MongoDB cluster.retryWrites=false
。