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…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...

使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...

dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...

视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...
音视频——I2S 协议详解
I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议,专门用于在数字音频设备之间传输数字音频数据。它由飞利浦(Philips)公司开发,以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...
第7篇:中间件全链路监控与 SQL 性能分析实践
7.1 章节导读 在构建数据库中间件的过程中,可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中,必须做到: 🔍 追踪每一条 SQL 的生命周期(从入口到数据库执行)&#…...