Retryable Writes

在本页面

3.6 版的新功能。

可重试写入允许 MongoDB 驱动程序在遇到网络错误或无法在replica setssharded cluster中找到正常的primary时,一次自动重试某些写入操作。

Prerequisites

可重试写入具有以下要求:

MMAPv1 存储引擎不支持重试写入。

  • 3 .6 MongoDB 驱动程序

    • Client 端需要为 MongoDB 3.6 更新的 MongoDB 驱动程序:
Java 3.6+

Python 3.6+
C 1.9
C#2.5
Node 3.0+
Ruby 2.5
Perl 2.0
PHPC 1.4+
Scala 2.2+
  • MongoDB Version

    • 集群中每个节点的 MongoDB 版本必须为3.6或更高,集群中每个节点的featureCompatibilityVersion必须为3.6或更高。有关featureCompatibilityVersion标志的更多信息,请参见setFeatureCompatibilityVersion
  • Write Acknowledgment

启用可重试写入

MongoDB 驱动程序默认不启用不重试写入。

mongodb://localhost/?retryWrites=true
mongo --retryWrites

可重试的写操作

当发出已确认的写入问题时,以下写入操作可以重试;例如Write Concern不能为{w: 0}

MethodsDescriptions
db.collection.insertOne()

db.collection.insert()
db.collection.insertMany()
Insert operations.
db.collection.updateOne()
db.collection.replaceOne()
db.collection.save()
db.collection.update(),其中multifalse
单文档更新操作。
db.collection.deleteOne()
db.collection.remove(),其中justOnetrue
单个文档删除操作。
db.collection.findAndModify()
db.collection.findOneAndDelete()
db.collection.findOneAndReplace()
db.collection.findOneAndUpdate()
findAndModify个操作。所有findAndModify操作都是单个文档操作。
db.collection.bulkWrite()具有以下写操作:
insertOne
updateOne
replaceOne
deleteOne
仅由单文档写操作组成的批量写操作。可重试的批量操作可以包括指定写操作的任意组合,但不能包括任何多文档写操作,例如updateMany
Bulk个操作:
Bulk.find.removeOne()
Bulk.find.replaceOne()
Bulk.find.replaceOne()
仅由单文档写操作组成的批量写操作。可重试的批量操作可以包括指定写操作的任意组合,但不能包括任何多文档写操作,例如updatemulti选项指定true

Behavior

永久性网络错误

MongoDB 可重试写入仅进行一次“ **”重试尝试。这有助于解决瞬态网络错误和副本集选举,但不能解决持久性网络错误。

Failover Period

如果驱动程序在目标副本集或分片的群集分片中找不到正常的primary,则驱动程序将 awaitserverSelectionTimeoutMS毫秒来确定新的主数据库,然后再重试。可重试的写操作不会解决故障转移时间段超过serverSelectionTimeoutMS的实例。

Warning

如果在发出写操作后 Client 端应用程序暂时不响应localLogicalSessionTimeoutMinutes,则有可能在 Client 端应用程序开始响应(不重新启动)时重试并再次应用写操作。

Diagnostics

版本 3.6.3 中的新功能。

serverStatus命令及其mongo shell 帮助程序db.serverStatus()transactions部分中包含有关可重试写入的统计信息。

针对本地数据库的可重试写入

您无法在启用了可重试写入的情况下对local database中的集合执行写入操作。

兼容 MongoDB 3.6 的官方驱动程序默认情况下会禁用可重试的写入。要显式禁用可重试写入,请在connection string中为 MongoDB 集群指定retryWrites=false