首页 > 数据库 >MongoDB CRUD操作:可重试写入

MongoDB CRUD操作:可重试写入

时间:2024-06-04 22:05:02浏览次数:14  
标签:驱动程序 MongoDB CRUD 重试 文档 操作 写入

MongoDB CRUD操作:可重试写入

文章目录


MongoDB的Retryable Writes是一种容错机制,旨在提高数据库操作的可靠性和稳定性。用于在遇到网络波动、副本集节点故障等临时性问题时,自动重新执行写操作。这种机制的目的是确保数据能够安全、准确地写入数据库,从而增强数据库的鲁棒性和可用性。

可重试写入

使用的先决条件

要使用可重试写入,有以下先决条件要求:

部署的限制

可重试写入需要副本集或分片集群,不支持独立实例。

支持的存储引擎

可重试写入需要支持文档级锁定的存储引擎,例如 WiredTiger 或内存存储引擎。

3.6+ MongoDB 驱动程序

客户端需要针对 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+

MongoDB 版本

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

写确认

写入关注值为 0 的写入操作不可重试。

可重试写入和多文档事务

事务提交和中止操作是可重试的写操作。如果提交操作或中止操作遇到错误,MongoDB 驱动程序会重试该操作一次,无论 retryWrites 是否设置为 false。

无论 retryWrites 的值如何,事务内的写入操作都不可单独重试。

启用可重试写入

MongoDB驱动

与 MongoDB 4.2 及更高版本兼容的驱动程序默认启用可重试写入。早期的驱动程序需要 retryWrites=true 选项。在使用与 MongoDB 4.2 及更高版本兼容的驱动程序的应用程序中,可以省略 retryWrites=true 选项。
要禁用可重试写入,使用与 MongoDB 4.2 及更高版本兼容的驱动程序的应用程序必须在连接字符串中包含 retryWrites=false。

mongosh

mongosh 中默认启用可重试写入。要禁用可重试写入,请使用 --retryWrites=false 命令行选项:

mongosh --retryWrites=false

可重试的写操作

当发出已确认的写关注时,以下写操作可重试;例如,写关注不能为 {w.0}: 0}.

事务内的写入操作不可单独重试。

方法说明
db.collection.insertOne()插入操作
db.collection.insertMany()插入操作
db.collection.updateOne()单文档更新操作
db.collection.replaceOne()单文档更新操作
db.collection.deleteOne()单文档删除
db.collection.remove()其中justOnetrue单文档删除
db.collection.findAndModify()单文档更新
db.collection.findOneAndDelete()单文档删除
db.collection.findOneAndReplace()单文档更新
db.collection.findOneAndUpdate()单文档更新
db.collection.bulkWrite()的写操作insertOneupdateOnereplaceOnedeleteOne只包含单文档写入操作的批量写入操作。可重试的批量操作可包括指定写入操作的任何组合,但不能包括任何多文档写入操作,如updateMany
Bulk操作的Bulk.find.removeOne()Bulk.find.replaceOne()Bulk.find.updateOne()只包含单文档写入操作的批量写入操作。可重试的批量操作可以包括指定写入操作的任何组合,但不能包括任何多文档写入操作,例如为多选项指定为true的更新

行为

持续的网络错误

MongoDB的可重试写入只进行一次重试尝试,这会有助于解决瞬时网络错误和副本集选举问题,但不能解决持续性网络错误。

故障切换周期

如果驱动程序在目标副本集或分片集群分片中找不到运行状况良好的主数据库,则驱动程序将等待serverSelectionTimeoutMS毫秒以确定新的主数据库,然后再重试。可重试写入不能解决故障转移时间超过serverSelectionTimeoutMS的情况。

如果客户端应用程序在发出写入操作后无响应的时间超过localLogicalSessionTimeoutMinutes,则当客户端应用程序开始响应(无需重新启动)时,可能会重试并再次应用写入操作。

诊断

serverStatus命令及其mongosh shell辅助程序db.serverStatus()包含事务部分中可重试写入的统计数据。

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

MongoDB 官方驱动程序默认启用可重试写入,除非显式禁用可重试写入,否则写入本地数据库的应用程序会遇到写入错误。

要禁用可重试写入,可在MongoDB集群的连接字符串中指定retryWrites=false

错误处理

从MongoDB 6.1开始,如果可重试写入的第一次和第二次尝试都失败而没有执行单个写入,则返回带有NoWritesPerformed标签的错误。NoWritesPerformed标签区分批处理操作(如 insertMany())的结果。在insertMany操作中,可能会出现以下结果之一:

结果MongoDB输出
没有插入任何文档使用NoWritesPerformed标签返回错误
部分工作已完成。 (至少插入一份文档,但不是全部。)没有NoWritesPerformed标签时返回错误
所有文档均已插入成功返回

应用程序可以使用NoWritesPerformed标签来明确没有插入任何文档,该错误报告让应用程序可以在处理可重试写入时保持数据库的准确状态。

在MongoDB的早期版本中,当第一次和第二次可重试写入尝试失败时,会返回错误。但没有任何区别来表明没有执行写入。

标签:驱动程序,MongoDB,CRUD,重试,文档,操作,写入
From: https://blog.csdn.net/superatom01/article/details/139454985

相关文章

  • MongoDb副本集
    Mongodb副本集复制简介复制是将数据的相同副本保留在多台服务器上的一种方法,建议将其用于所有生产部署中。即使一台或多台服务器停止运行,使用复制功能也可以确保应用程序正常运行和数据安全。在MongoDB中,创建副本集(replicaset)后就可以使用复制功能了。副本集是一组服务器,其......
  • Mongodb
    什么是MongoDB?MongoDB是一个基于分布式文件存储的NoSQL数据库,由C++语言编写,旨在为高性能、高可扩展性的应用提供存储支持。MongoDB将数据存储在一个类似JSON的二进制格式BSON中,这使得它非常灵活和高效。启动MongoDB服务Windows和macOS:mongod--dbpath<your_db_path>Lin......
  • MongoDB CRUD操作:批量写操作
    MongoDBCRUD操作:批量写操作文章目录MongoDBCRUD操作:批量写操作关于批量操作的顺序bulkWrite()支持的方法举例向分片集合批量插入的策略预分割集合无序写入mongos避免单调节流MongoDB提供了批量执行写入操作的能力,但批量写入操作只影响单个集合,MongoDB允许应用......
  • Axios请求失败重试实现
    代码实现//request.tsimportaxios,{AxiosRequestConfig}from"axios";//自定义ReuqestConfiginterfaceRetryConfgextendsAxiosRequestConfig{retry:number,retryDelay:number,retryCount?:number;}//创建请求实例constrequest=axios.......
  • MongoDB CRUD操作:更新文档
    MongoDBCRUD操作:更新文档文章目录MongoDBCRUD操作:更新文档更新集合中的文档更新单个文档更新多个文档文档替换在MongoDBAtlas中更新文档更新行为原子性_id字段字段顺序Upsert选项写确认可以使用下面的方式更新MongoDB集合的文档:使用编程语言提供的驱动程序,在应......
  • 用Python脚本迁移MongoDB数据到金仓-kingbase数据库
    1、首先需要明确MongoDB与kingbase的对应关系,collection相当于table,filed相当于字段,根据这个对应关系创建表;此次迁移的MongoDB里的数据字段是:_id(自动生成的objectid),image(转成二进制存储的文档)所以在金仓里创建表createtableadmin(idvarchar,imagebytea);2、安装Python环境......
  • mongodb数据库查询调优之explain方法详解
    在MongoDB中,explain()方法可以帮助我们了解查询语句的执行计划和性能。通过分析explain()的结果,我们可以找出潜在的性能问题并对其进行优化。以下是使用explain()方法对MongoDB查询语句进行优化的步骤:使用explain()方法获取查询的执行计划:db.collection.find(query).exp......
  • MyBatis完成CRUD 详细细节内容
    1.MyBatis完成CRUD详细细节内容@目录1.MyBatis完成CRUD详细细节内容每博一文案2.MyBatis工具类SqlSessionUtil的封装3.准备工作3.1insert添加/插入记录3.2delete删除记录3.3update修改记录3.4select查询记录3.4.5select查询一条记录3.4.6select查询多条记录4.......
  • 使用Java API 操作MongoDB
    除了通过启动mongo进程进入Shell环境访问数据库外,MongoDB还提供了其他基于编程语言的数据库访问方法。MongoDB官方提供了编程语言的驱动包,利用这些驱动包可以使用编程方法连接并操作MongoDB数据库。想要使用 Java程序操作 MongoDB,需要确保您的电脑上已经安装了Mong......
  • 递减 MongoDB 值,防止出现负数
    我正在使用MongoDB,我有一个文档,我想在其中递增一个计数字段。但是,我需要确保该计数不会低于零。例如,如果inc为-2,而当前计数为1,那么应用$inc将导致计数为-1,而这正是我希望避免的。以下是我当前使用的更新操作:db.collection.updateMany({'_id':{'$in':object_ids}},{......