MongoDB CRUD操作:可重试写入

MongoDB CRUD操作:可重试写入

文章目录

  • MongoDB CRUD操作:可重试写入
    • 使用的先决条件
      • 部署的限制
      • 支持的存储引擎
      • 3.6+ MongoDB 驱动程序
      • MongoDB 版本
      • 写确认
    • 可重试写入和多文档事务
    • 启用可重试写入
      • MongoDB驱动
      • mongosh
    • 可重试的写操作
    • 行为
      • 持续的网络错误
      • 故障切换周期
      • 诊断
      • 针对本地数据库的可重试写入
      • 错误处理

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/847716.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux如何远程连接服务器?

远程连接服务器是当代计算机技术中一个非常重要的功能,在各种领域都有广泛的应用。本文将重点介绍如何使用Linux系统进行远程连接服务器操作。 SSH协议 远程连接服务器最常用的方式是使用SSH(Secure Shell)协议。SSH是一种网络协议&#xff…

Java常规题技术分享

一、数组排序和添加成员 设计类Student和类StudentClass。 (1) 类Student有字符串属性name、double属性grade和int属性age 有带参数的构造方法,可设置三个属性的值 有各个属性的置取方法 (2)类StudentClass有Student数组属性stus存放班级成员,有int…

「不只是框架:Django REST framework的超能力大揭秘」

想要让你的API服务像五星级餐厅一样令人难忘吗?今天阿佑将为你揭晓!从基础的RESTful原则到Django REST framework的高级特性,我们一步步带你走进API开发的后厨,展示如何准备食材(数据模型)、调制酱料&#…

揭秘GPU技术新趋势:从虚拟化到池化

从GPU虚拟化到池化 大模型兴起加剧GPU算力需求,企业面临GPU资源有限且利用率不高的挑战。为打破这一瓶颈,实现GPU算力资源均衡与国产化替代,GPU算力池化成为关键。本文深入探讨GPU设备虚拟化途径、共享方案及云原生实现,旨在优化资…

Java EE-Spring Session实现(如何导入依赖、配置文件)

Spring Session Session 共享问题 在 Web 项目开发中,Session 会话管理是一个很重要的部分,用于存储与记录用户的状态或相关的数据。 通常情况下 session 交由容器(tomcat)来负责存储和管理,但是如果项目部署在多台…

yolov5模型结构与构建原理

一.yolov5模型结构与构建原理 修改模型结构,全部在models文件夹下面 models/common.py (加入新增网络细节) models/yolo.py (设定网络结构传参细节) models/##.yaml (修改模型结构配置文…

测试文章27-这是一篇测试文章请忽略

这是一篇测试文章请忽略 这是测试的文字,如有打扰请谅解。稍后测试完毕会删除 ‍ ‍ 测试代码块 ‍ public static void main(String[] args){System.out.println("Hello, World!"); } aaa

kill 不管用时,类型为C

当使用nvidia-smi时看到类型为C的进程时,使用 kill -9 PID,却不管用,这时需要先使用如下命令,找出运行的脚本对应的所有PID: ps -aux | grep train.py 接着就会把train.py对应运行的进程全部展示出来: 接着就是使用 …

C++ 习题精选(3)——只出现一次的数字

目录 1. 只出现一次的数字 I2. 只出现一次的数字 II 1. 只出现一次的数字 I 题目描述:给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。你必须设计并实现线性时间复杂度&…

Go 延迟调用机制

defer延迟调用机制 是什么?为什么? 延迟调用是函数return正常结束后或者painc异常结束前会执行的一些操作。 再申请资源的时候延迟调用,防止忘记资源释放,数据库、文件、锁等资源释放。 延迟调用的顺序? 会按先进后出的…

景源畅信电商:抖音小店怎么做好运营?

在如今这个数字化时代,电商平台如雨后春笋般涌现,其中抖音小店以其独特的短视频营销模式迅速崛起。如何在这个竞争激烈的市场中占据一席之地,成为了许多商家和创业者思考的问题。下面,我们将深入探讨抖音小店的运营策略&#xff0…

多线程插入10万条数据,且避免堆栈溢出

在多线程环境下插入大量数据(如10万条)时,避免堆栈溢出的关键在于合理管理线程的生命周期、控制递归深度(如果使用了递归的话),以及合理分配每个线程处理的数据量。以下是一些建议来实现这个目标&#xff1…

论文阅读[268]基于EEM荧光光谱,感知燃烧产生的颗粒物

【论文基本信息】 标题:EEM Fluorescence Spectroscopy based Sensing of Combustion Generated Particulate Matter 来源与类型:华盛顿大学,博士学位论文 推荐理由:论文作者将主成分回归(PCR)方法与三维荧光光谱结合,预测样本中特定类污染物的总浓度,准确率达到了97.6…

Qt——控件

目录 概念 QWidget核心属性 enabled geometry WindowFrame的影响 windowTitle windowIcon qrc的使用 windowOpacity cursor font toolTip focusPolicy ​编辑 styleSheet 按钮类控件 PushButton RadioButton CheckBox 显示类控件 Label textFormat pixm…

docker run 两个挂载路径怎么设置

docker run 两个挂载路径怎么设置 在使用 docker run 命令时,如果需要挂载多个宿主机目录到容器中,您只需为每个挂载路径添加一个 -v 或 --volume 选项即可。下面是一个示例,展示了如何挂载两个宿主机目录到容器的不同路径上: Bas…

MongoDB CRUD操作:地理位置应用——通过地理空间查询查找餐厅

MongoDB CRUD操作:地理位置应用——通过地理空间查询查找餐厅 文章目录 MongoDB CRUD操作:地理位置应用——通过地理空间查询查找餐厅地图的扭曲搜索餐厅浏览数据查找当前邻居查找附近所有餐厅查找一定距离内的餐厅使用$geoWithin,不排序使用…

redhat遇到安装包缺失问题

缺失的文件用repoquery --nvr --whatprovides XXX 查询 repoquery --nvr --whatprovides libstdc.so.6然后使用yum -y install XXX 选择查询到的文件的安装 yum -y install libstdc-8.5.0-3.el8Last metadata expiration check: 0:06:30 ago on Wed Jun 5 04:02:24 2024. lib…

模板进阶

非类型模板参数(常量参数) 相当于向类传递常量(编译前确定)参数 只能传整型/size_t,不可double等 C20 后可以支持其他内置类型(可指针) 自定义类型的实参永远不行 array 可理解为固定size的…

JS继承的方式

目录 原型链继承构造函数继承组合继承寄生组合继承ES6 Class 继承原型链继承 原理: 通过将子类的原型(prototype)设置为父类的一个实例,使得子类实例能够沿着原型链访问到父类的属性和方法。 function Parent() {this.parentProperty

在点云地图中进行点云计数

文章目录 概要头文件主要代码概要 在激光SLAM(Simultaneous Localization and Mapping)中,局部点云地图是通过激光雷达扫描捕捉到的周围环境的局部三维点集合。统计局部点云地图中的所有点数目是一个常见的需求,这可以帮助我们了解数据的密集程度、有效性等。 为了统计局…