MongoDB CRUD操作:可重试写入

2024-06-05 10:04

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

这篇关于MongoDB CRUD操作:可重试写入的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1032755

相关文章

Ubuntu 24.04启用root图形登录的操作流程

《Ubuntu24.04启用root图形登录的操作流程》Ubuntu默认禁用root账户的图形与SSH登录,这是为了安全,但在某些场景你可能需要直接用root登录GNOME桌面,本文以Ubuntu2... 目录一、前言二、准备工作三、设置 root 密码四、启用图形界面 root 登录1. 修改 GDM 配

JSONArray在Java中的应用操作实例

《JSONArray在Java中的应用操作实例》JSONArray是org.json库用于处理JSON数组的类,可将Java对象(Map/List)转换为JSON格式,提供增删改查等操作,适用于前后端... 目录1. jsONArray定义与功能1.1 JSONArray概念阐释1.1.1 什么是JSONA

Java操作Word文档的全面指南

《Java操作Word文档的全面指南》在Java开发中,操作Word文档是常见的业务需求,广泛应用于合同生成、报表输出、通知发布、法律文书生成、病历模板填写等场景,本文将全面介绍Java操作Word文... 目录简介段落页头与页脚页码表格图片批注文本框目录图表简介Word编程最重要的类是org.apach

Python实现对阿里云OSS对象存储的操作详解

《Python实现对阿里云OSS对象存储的操作详解》这篇文章主要为大家详细介绍了Python实现对阿里云OSS对象存储的操作相关知识,包括连接,上传,下载,列举等功能,感兴趣的小伙伴可以了解下... 目录一、直接使用代码二、详细使用1. 环境准备2. 初始化配置3. bucket配置创建4. 文件上传到os

mysql表操作与查询功能详解

《mysql表操作与查询功能详解》本文系统讲解MySQL表操作与查询,涵盖创建、修改、复制表语法,基本查询结构及WHERE、GROUPBY等子句,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随... 目录01.表的操作1.1表操作概览1.2创建表1.3修改表1.4复制表02.基本查询操作2.1 SE

MyBatisPlus如何优化千万级数据的CRUD

《MyBatisPlus如何优化千万级数据的CRUD》最近负责的一个项目,数据库表量级破千万,每次执行CRUD都像走钢丝,稍有不慎就引起数据库报警,本文就结合这个项目的实战经验,聊聊MyBatisPl... 目录背景一、MyBATis Plus 简介二、千万级数据的挑战三、优化 CRUD 的关键策略1. 查

c++中的set容器介绍及操作大全

《c++中的set容器介绍及操作大全》:本文主要介绍c++中的set容器介绍及操作大全,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录​​一、核心特性​​️ ​​二、基本操作​​​​1. 初始化与赋值​​​​2. 增删查操作​​​​3. 遍历方

MySQL追踪数据库表更新操作来源的全面指南

《MySQL追踪数据库表更新操作来源的全面指南》本文将以一个具体问题为例,如何监测哪个IP来源对数据库表statistics_test进行了UPDATE操作,文内探讨了多种方法,并提供了详细的代码... 目录引言1. 为什么需要监控数据库更新操作2. 方法1:启用数据库审计日志(1)mysql/mariad

springboot如何通过http动态操作xxl-job任务

《springboot如何通过http动态操作xxl-job任务》:本文主要介绍springboot如何通过http动态操作xxl-job任务的问题,具有很好的参考价值,希望对大家有所帮助,如有错... 目录springboot通过http动态操作xxl-job任务一、maven依赖二、配置文件三、xxl-

Oracle 数据库数据操作如何精通 INSERT, UPDATE, DELETE

《Oracle数据库数据操作如何精通INSERT,UPDATE,DELETE》在Oracle数据库中,对表内数据进行增加、修改和删除操作是通过数据操作语言来完成的,下面给大家介绍Oracle数... 目录思维导图一、插入数据 (INSERT)1.1 插入单行数据,指定所有列的值语法:1.2 插入单行数据,指