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()其中justOne为true | 单文档删除 |
db.collection.findAndModify() | 单文档更新 |
db.collection.findOneAndDelete() | 单文档删除 |
db.collection.findOneAndReplace() | 单文档更新 |
db.collection.findOneAndUpdate() | 单文档更新 |
db.collection.bulkWrite()的写操作insertOne、updateOne、replaceOne、deleteOne | 只包含单文档写入操作的批量写入操作。可重试的批量操作可包括指定写入操作的任何组合,但不能包括任何多文档写入操作,如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操作:可重试写入
MongoDB CRUD操作:可重试写入 文章目录 MongoDB CRUD操作:可重试写入使用的先决条件部署的限制支持的存储引擎3.6 MongoDB 驱动程序MongoDB 版本写确认 可重试写入和多文档事务启用可重试写入MongoDB驱动mongosh 可重试的写操作行为持续的网络错误故障切…...
Microsoft Outlook Lite 引入短信功能
随着科技的不断进步,我们的沟通方式也在不断演变。微软最新推出的 Outlook Lite 应用,不仅为我们提供了一个轻量级的电子邮件管理工具,现在更是带来了一项令人兴奋的新功能——短信服务。 Outlook Lite:轻量级,功能全…...
Redis的数据结构以及对应的使用场景
Redis支持的数据结构包括字符串(String)、列表(List)、哈希(Hash)、集合(Set)、有序集合(Sorted Set)等。这些数据结构在应用开发中扮演着重要的角色,它们各自适用于不同的使用场景和需求。以下是对Redis各数据结构的详细分析及它们的使用场景: 字符串(S…...
Vue中如何获取dom元素?
在Vue中,通常我们不直接操作DOM元素,因为Vue是一个声明式渲染的框架,它鼓励我们使用数据驱动视图的方式来更新UI。然而,在某些情况下,你可能需要直接访问DOM元素。在这种情况下,你可以使用Vue的ref属性和$r…...
前端最新面试题(基础模块HTML/CSS/JS篇)
目录 一、HTML、HTTP、WEB综合问题 1 前端需要注意哪些SEO 2 img的title和alt有什么区别 3 HTTP的几种请求方法用途 4 从浏览器地址栏输入url到显示页面的步骤 5 如何进行网站性能优化 6 HTTP状态码及其含义 7 语义化的理解 8 介绍一下你对浏览器内核的理解? 9 html…...
matlab模拟太阳耀斑喷发
代码 function simulate_solar_flare% 参数设置gridSize 100; % 网格大小timeSteps 200; % 时间步数dt 0.1; % 时间步长% 初始化网格[X, Y] meshgrid(linspace(-5, 5, gridSize));Z zeros(size(X));% 设置耀斑初始位置和强度flareCenter [0, 0]; % 耀斑中心位置flareRad…...
WebStorm 2024.1.1 Mac激活码 前端开发工具集成开发环境(IDE)
WebStorm 2024 Mac激活码 搜索Mac软件之家下载WebStorm 2024 Mac激活版 WebStorm 2024 功能介绍 WebStorm 2024是由JetBrains公司开发的一款专为前端开发设计的集成开发环境(IDE)。它提供了一整套功能,旨在提高Web开发者的工作效率和代码质…...
多项目的.net core解决方案(项目间引用)如何使用Docker部署
解决方案内部项目之间引用很正常,但我docker不是很熟,对一些基础命令含义还理解不深入,部署引用其他项目的项目总不成功。搜到了一篇非常适合初学者,从dockerfile命令讲解,到解决引用其他项目时如何docker部署的文章。…...
使用raise语句抛出异常
自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 如果某个函数或方法可能会产生异常,但不想在当前函数或方法中处理这个异常,则可以使用raise语句在函数或方法中抛出异常。rai…...
vue组件中data为什么必须是一个函数?
在 Vue 中,组件的 data 必须是一个函数,而不是一个对象,这是为了保证每个组件实例都可以维护一份被返回对象的独立的拷贝。如果 data 是一个对象,那么所有的组件实例将共享同一个引用,导致一个组件实例的数据变化会影响…...
10-Django项目--Ajax请求
目录 Ajax请求 简单示范 html 数据添加 py文件 html文件 demo_list.html Ajax_data.py 图例 Ajax请求 简单示范 html <input type"button" id"button-one" class"btn btn-success" value"点我"> <script>/…...
二进制安装Prometheus
从 https://prometheus.io/download/ 下载相应版本,安装到服务器上官网提供的是二进制版,解压就 能用,不需要编译 1、下载软件 [rootlocalhost ~]# wget -c https://github.com/prometheus/prometheus/releases/download/v2.45.5/prometheus…...
Git配置SSH-Key
git config --global user.name 沈健 git config --global user.email sjshenjianoutlook.com初次使用 SSH 协议进行代码克隆、推送等操作时,需按下述提示完成 SSH 配置 1 生成 RSA 密钥 ssh-keygen -t rsa2. 获取 RSA 公钥内容,并配置到 SSH公钥 中 …...
处理多语言文案的工具
处理多语言文案的工具 离线的处理多语言文案的工具 用于开发软件过程中,加速多语言文案的导出,导入,校对,复用已经翻译的多语言文案 SDL Trados Studio:一款专业的离线多语言翻译管理工具,支持导入、导出…...
手把手教你MMDetection实战
论文下载地址:点击这里 本页提供有关MMDetection用法的基本教程。有关安装说明,请参阅INSTALL.md。 目录 预训练模型的推论训练模型有用的工具如何预训练模型的推论 我们提供测试脚本以评估整个数据集(COCO,PASCAL VOC等),还提供一些高级api,以便更轻松地集成到其他项…...
C++的爬山算法
爬山算法(Hill Climbing Algorithm)是一种局部搜索算法,它通过迭代搜索的方式寻找问题的局部最优解。在爬山过程中,算法总是选择当前状态邻域中最好(即函数值最大或最小)的状态作为下一个状态,直…...
Lumière:开创性的视频生成模型及其应用
视频内容创造领域迎来了突破性进展,但视频生成模型由于运动引入的复杂性而面临更多挑战。这些挑战主要源自运动的引入所带来的复杂性。时间连贯性是视频生成中的关键要素,模型必须确保视频中的运动在时间上是连贯和平滑的,避免出现不自然的跳…...
MySQL:MySQL的EXPLAIN各字段含义详解
在MySQL中,EXPLAIN是一个强大的工具,用于获取关于SELECT语句执行计划的信息。当你对查询性能有疑问时,使用EXPLAIN可以帮助你理解MySQL如何执行你的查询,并可能揭示性能瓶颈。 以下是EXPLAIN输出中各个列的详细解释: …...
域内路由选择协议——RIP
例题 RIP(Routing Information Protocol)是一种基于距离向量的路由协议,使用跳数作为度量标准来决定最优路径。下面我们详细分析为什么RIP协议要这样设计。 RIP协议的基本工作原理 距离向量算法: 每个路由器维护一张路由表&…...
JVM学习-MAT
MAT(Memory Analyzer Tool) 基本概述 Java堆内存分析器,可以用于查找内存泄漏以及查看内存消耗情况MAT是基于Eclipse开发的,不仅可以单独使用,还能以插件方式嵌入Eclipse中使用,是一款免费的性能分析工具 获取堆dump文件 dump…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...
理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...
LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...
音视频——I2S 协议详解
I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议,专门用于在数字音频设备之间传输数字音频数据。它由飞利浦(Philips)公司开发,以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...
【C++进阶篇】智能指针
C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...
从面试角度回答Android中ContentProvider启动原理
Android中ContentProvider原理的面试角度解析,分为已启动和未启动两种场景: 一、ContentProvider已启动的情况 1. 核心流程 触发条件:当其他组件(如Activity、Service)通过ContentR…...
Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成
一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...
