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

相关文章

Mysql表的简单操作(基本技能)

《Mysql表的简单操作(基本技能)》在数据库中,表的操作主要包括表的创建、查看、修改、删除等,了解如何操作这些表是数据库管理和开发的基本技能,本文给大家介绍Mysql表的简单操作,感兴趣的朋友一起看... 目录3.1 创建表 3.2 查看表结构3.3 修改表3.4 实践案例:修改表在数据库中,表的操作主要

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

Java使用Curator进行ZooKeeper操作的详细教程

《Java使用Curator进行ZooKeeper操作的详细教程》ApacheCurator是一个基于ZooKeeper的Java客户端库,它极大地简化了使用ZooKeeper的开发工作,在分布式系统... 目录1、简述2、核心功能2.1 CuratorFramework2.2 Recipes3、示例实践3

Java利用JSONPath操作JSON数据的技术指南

《Java利用JSONPath操作JSON数据的技术指南》JSONPath是一种强大的工具,用于查询和操作JSON数据,类似于SQL的语法,它为处理复杂的JSON数据结构提供了简单且高效... 目录1、简述2、什么是 jsONPath?3、Java 示例3.1 基本查询3.2 过滤查询3.3 递归搜索3.4

Python使用DrissionPage中ChromiumPage进行自动化网页操作

《Python使用DrissionPage中ChromiumPage进行自动化网页操作》DrissionPage作为一款轻量级且功能强大的浏览器自动化库,为开发者提供了丰富的功能支持,本文将使用Dri... 目录前言一、ChromiumPage基础操作1.初始化Drission 和 ChromiumPage

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件

Redis中管道操作pipeline的实现

《Redis中管道操作pipeline的实现》RedisPipeline是一种优化客户端与服务器通信的技术,通过批量发送和接收命令减少网络往返次数,提高命令执行效率,本文就来介绍一下Redis中管道操... 目录什么是pipeline场景一:我要向Redis新增大批量的数据分批处理事务( MULTI/EXE

使用Python高效获取网络数据的操作指南

《使用Python高效获取网络数据的操作指南》网络爬虫是一种自动化程序,用于访问和提取网站上的数据,Python是进行网络爬虫开发的理想语言,拥有丰富的库和工具,使得编写和维护爬虫变得简单高效,本文将... 目录网络爬虫的基本概念常用库介绍安装库Requests和BeautifulSoup爬虫开发发送请求解

Oracle存储过程里操作BLOB的字节数据的办法

《Oracle存储过程里操作BLOB的字节数据的办法》该篇文章介绍了如何在Oracle存储过程中操作BLOB的字节数据,作者研究了如何获取BLOB的字节长度、如何使用DBMS_LOB包进行BLOB操作... 目录一、缘由二、办法2.1 基本操作2.2 DBMS_LOB包2.3 字节级操作与RAW数据类型2.

JDK多版本共存并自由切换的操作指南(本文为JDK8和JDK17)

《JDK多版本共存并自由切换的操作指南(本文为JDK8和JDK17)》本文介绍了如何在Windows系统上配置多版本JDK(以JDK8和JDK17为例),并通过图文结合的方式给大家讲解了详细步骤,具有... 目录第一步 下载安装JDK第二步 配置环境变量第三步 切换JDK版本并验证可能遇到的问题前提:公司常