MongoDB事务机制

事务机制

1.事务概念

  在对数据的操作的过程中,涉及到一连串的操作,这些操作如果失败,会导致我们的数据部分变化了,部分没变化。这个过程就好比如你去吃早餐,你点完餐了,并且吃完早餐了,没付钱你就跑了,这不符合正常的流程,要保证你是否付钱了,现在有收款语音播报器,能清楚你是否付了钱了。为确保数据的可靠性,采用事务来进行处理。

事务涉及了四个基本特性(ACID):

  1. 原子性(atomicity):事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行。
  2. 一致性(consistency):事务应确保数据库的状态从一个一致状态转变为另一个一致状态。一致状态的含义是数据库中的数据应满足完整性约束。
  3. 隔离性(isolation):多个事务并发执行时,一个事务的执行不应影响其他事务的执行。
  4. 持久性(durability):已被提交的事务对数据库的修改应该是永久性的。

2. 使用事务

  事务和其他支持事务的数据库一样,需要开启和提交事务,MongoDB事务涉及到wirteConcern和readConcern两个属性上

2.1wirteConcern

  `wirteConcern决定了写操作需要落入到多少个节点才算成写入成功

writeConcern的属性有
1.w
w  为0时,对写入数据的正确性不关心,不需要确认
w  为1时, 数据写入到主节点就与客户端进行确认
w  为majority时,数据写入到大多数成员后,再与客户端进行确认
2.  具体的数字
j 为true时,数据写入到主节点持久化后,就与客户端进行确认
3.wtimeout 写入超时时间,防止一直等待的情况,超过超时时间未结束,写入失败
4. 具体的数字
落入到具体数字的节点才与客户端确认

// 包含延迟节点的3节点pss复制集
db.collection.insertOne({name:"李四"},writeConcern:{w:"majority"}})
//  等待延迟节点写入数据后才会响应
db.collection.insertOne({name:"王五"},{writeConcern:{w:3}})
//  超时写入失败
db.collection.insertOne({name:"小明"},{writeConcern:{w:3,wtimeout:3000}})

使用事务的话,大多数情况时使用{w:"majority"}

2.2 readConcern

  读取处于事务中的数据时,需要知道从那读,以及能读取什么样的数据。

  1. readPreferce来解决从哪读的问题

其中选择节点读取的参数有如下:

(1)primary: 只选择主节点,默认模式;
(2)primaryPreferred:优先选择主节点,如果主节点不可用则选择从节点;
(3)secondary:只选择从节点;
(4)secondaryPreferred:优先选择从节点, 如果从节点不可用则选择主节点
(5)nearest:根据客户端对节点的 Ping 值判断节点的远近,选择从最近的节点读取。

具体使用:

# 通过 MongoDB 驱动程序 API
MongoCollection.withReadPreference(ReadPreference readPref)

# Mongo Shell(指定从哪读) 使用readPref简写
db.collection.find().readPref( "secondary" )
db.fsyncLock() 锁定写入
db.fsyncUnLock() 解锁写入

Tag: readPreference的拓展

readPreference只能控制一类节点,而Tag可用于控制一到多个节点,可实现定制服务,某些节点负责在线服务,某个服务负责报表服务。
在这里插入图片描述
具体使用

# 为复制集节点添加标签
conf = rs.conf()
conf.members[1].tags = { purpose: "online"}
conf.members[4].tags = { purpose: "analyse"}
rs.reconfig(conf)

#查询
db.collection.find({}).readPref( "secondary", [ {purpose: "analyse"} ] )
  1. readConcern解决能读取什么样的数据

  决定从哪个节点读取数据后,还需要考虑读取什么样的数据,可选以下参数

(1) available:读取所有可用的数据;
(2) local:读取所有可用且属于当前分片的数据;
(3) majority:读取在大多数节点上提交完成的数据;
(4) inearizable:可线性化读取文档,仅支持从主节点读(线性);
(5) snapshot:读取最近快照中的数据,仅可用于多文档事务(不出现脏读、不可重复读、幻读);

脏读: 读取了事务回滚前的数据或未正确同步的数据

不可重复读: 事务A先读取了一条数据,此时事务B对该数据进行了更新,事务A再次读取了该数据,此时前后读取的数据不匹配

幻读: 事务A读取了N条数据,事务B对这N条数据进行了删除或新增操作,事务A重新读取数据时,数据的条数产生了变化,从而产生了幻读

  1. readConcern读取数据时引发脏读的原因以及解决办法

  写入数据只到达主节点,没有到达其他节点,一旦主节点出现故障,从节点没来得及复制数据,从而导致脏数据的出现。可以设置写入落入大多数节点时再进行写入,虽然消耗了点性能,但保证了数据的不丢失。设置{readConcern: “majority”}。

  1. 安全的实现读写分离

  安全的读写分离,有利于提高效率,并且确保数据安全,其中的措施是将写入和读取都使用majority这个值,确保数据在多个节点都是存在的,并且要选取备节点进行读取。

# 使用writeConcern+readConcern majority来解决
db.collection.insert({oid:101,sku:"kite",q:1},{writeConcern:{w:"majority"}})
db.collection.find({oid:101}).readPref("secondary").readConcern("majority")

5.事务流程

事务内的改变,事务外是无法获取的,直到提交事务后。

var session = db.getMongo().startSession()
# 开启事务
session.startTransaction()

var coll = session.getDatabase("test").getCollection("tx")
#事务内修改 {x:1, y:1}
coll.updateOne({x: 1}, {$set: {y: 1}})
#事务内查询 {x:1}
coll.findOne({x: 1})  //{x:1, y:1}

#事务外查询 {x:1}
db.tx.findOne({x: 1})  //{x:1}

#提交事务
session.commitTransaction()

# 或者回滚事务
session.abortTransaction()

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【文件包含】——日志文件注入

改变的确很难,但结果值得冒险 本文主要根据做题内容的总结,如有错误之处,还请各位师傅指正 一.伪协议的失效 当我们做到关于文件包含的题目时,常用思路其实就是使用伪协议(php:filter,data,inpput等等)执行…

职业技能大赛背景下的移动互联网应用软件开发(Android)实训室建设方案

一、建设背景 随着科技的持续进步,移动设备已成为人们日常生活中不可或缺的一部分。据相关数据,移动互联网的使用率在近年来显著上升。在这样的背景下,移动互联技术不仅推动了科技的发展,也渗透到了智能家居、车联网、工业自动化…

TESSY创建需要手写桩的测试用例

如果需要让桩函数有额外的功能,如:传参检测、局部数据处理、多传参检测、函数实现变更等,可以进行手写桩。 我们以tessy5.1 IDE为例,给大家展示编写一个需要手写桩的测试用例过程。 1、前期的准备工作 可以参考以下文章&#xff1…

Qt常用控件——QTextEdit

文章目录 QTextEdit核心属性和信号同步显示示例信号示例 QTextEdit核心属性和信号 QTextEdit表示多行输入框,是一个富文本和markdown编辑器,并且能在内存超出编辑框范围时自动提供滚动条。 QPlainTexEdit是纯文本,QTextEdit不仅表示纯文本&a…

记得忘记密码情况下如何退出苹果Apple ID

在日常使用苹果手机时,我们可能会遇到需要退出Apple ID的情况,比如更换手机、不再使用某些服务或出于安全考虑等。下面,我们就来详细介绍一下苹果手机如何退出Apple ID。 情况一:记得Apple ID密码 若是记得Apple ID密码&#xff…

Tomcat服务详解

一、部署Tomcat服务器 JDK安装官方网址:https://www.oracle.com/cn/java Tomcat安装官方网址:Apache Tomcat - Welcome! 安装JDK 1.获取安装包 wget https://download.oracle.com/otn/java/jdk/8u411-b09/43d62d619be4e416215729597d70b8ac/jdk-8u41…

透明任务栏怎么设置?Windows电脑任务栏透明效果(详尽指南)

电脑任务栏可以自定义调整透明度,在Windows10和Windows11系统中,任务栏透明是默认不透明的。如果想要设置任务栏透明度,那么推荐以下方法实现,简单三个步骤即可实现,一起来看看吧! 第一步、选择合适的任务栏…

基于鸿蒙API10的RTSP播放器(五:拖动底部视频滑轨实现跳转)

拖动前播放位置: 拖动后播放位置: 在Slider组件中,添加onChange方法进行监听,当视频轨道拖放结束时,触发this.seekTo()函数,其中seekTo函数需要传递一个视频已播放时长作为参数 Slider({ value: this.p…

【iOS】push和present的区别

【iOS】push和present的区别 文章目录 【iOS】push和present的区别前言pushpop presentdismiss简单小demo来展示dismiss和presentdismiss多级 push和present的区别区别相同点 前言 在iOS开发中,我们经常性的会用到界面的一个切换的问题,这里我们需要理清…

【专题】2024年8月医药行业报告合集汇总PDF分享(附原数据表)

原文链接:https://tecdat.cn/?p37621 在科技飞速发展的当今时代,医药行业作为关乎人类生命健康的重要领域,正处于前所未有的变革浪潮之中。数智医疗服务的崛起,为医疗模式带来了全新的转变,开启了医疗服务的新时代。…

SQL超时的常见原因和解决思路

目录 1. SQL超时的常见原因2. 解决思路2.1. 优化SQL查询2.2. 处理锁竞争2.3. 网络和连接配置2.4. 资源监控与调整 3. 预防措施4. 示例:设置SQL超时5. 总结 SQL超时问题常常会影响应用程序的性能和用户体验,了解和处理SQL超时的思路非常重要。以下是一些常…

【Oracle篇】全面理解优化器和SQL语句的解析步骤(含执行计划的详细分析和四种查看方式)(第二篇,总共七篇)

💫《博主介绍》:✨又是一天没白过,我是奈斯,DBA一名✨ 💫《擅长领域》:✌️擅长Oracle、MySQL、SQLserver、阿里云AnalyticDB for MySQL(分布式数据仓库)、Linux,也在扩展大数据方向的知识面✌️…

干部画像系统的意义

干部画像系统是一个高度集成且功能丰富的管理工具,在干部管理、选拔、培养和评价等多个方面发挥着重要作用。显著提升干部管理工作的科学性、准确性和效率性。干部画像系统的意义主要包括: 1、增强干部选拔的精准性 干部画像系统通过全面收集和分析干部…

第15-05章:获取运行时类的完整结构

我的后端学习大纲 我的Java学习大纲 6.1.第一组方法API: 1.API列表:java.lang.Class 类: 2.代码测试: public class ReflectionUtils{ puvblic static void main(String[] args){}// 第一组Testpublic void api_01{//上面截图的代码......…

下载 llama2-7b-hf 全流程【小白踩坑记录】

1、文件转换 在官网 https://ai.meta.com/llama/ 申请一个账号,选择要下载的模型,会收到一个邮件,邮件中介绍了下载方法 执行命令 git clone https://github.com/meta-llama/llama.git​ ,然后执行 llama/download.sh&#xff0c…

IP地址是怎么实现HTTPS访问的?

首先,需要明确的是,IP地址(Internet Protocol Address)是互联网上设备(如服务器、路由器等)的唯一标识符,它允许数据包在网络中正确地路由和传输。然而,IP地址本身并不直接支持HTTPS…

可测试,可维护,可移植:上位机软件分层设计的重要性

互联网中,软件工程师岗位会分前端工程师,后端工程师。这是由于互联网软件规模庞大,从业人员众多。前后端分别根据各自需求发展不一样的技术栈。那么上位机软件呢?它规模小,通常一个人就能开发一个项目。它还有必要分前…

中国水土保持能力防治数据集(1992-2019)

该数据集包括1992年至2019年中国每年的水土保持能力及其影响因子。这些数据是基于改进的RUSLE模型开发的,其中包含植被覆盖和管理(C)因子和降雨侵蚀率(R)因子作为重要的输入因子,针对不同区域进行了优化。 其中该数据集一共包含了9个数据它们分别是&…

Leetcode面试经典150题-82.删除排序链表中的重复元素II

之前写过这个题的基础第83题,看本文之前一定要先看懂这个Leetcode面试经典150题-82.删除排序链表中的重复元素II前序-83.删除排序链表中的重复元素_删除链表中重复的元素-CSDN博客 直接上代码了,解法都在代码里,不懂就留言或者私信 /*** De…

C++---string类常见接口

介绍 string类详情>>>https://cplusplus.com/reference/string/string/?kwstring 1. string是表示字符串的字符串类(感觉就像一个动态的字符数组) 2. 该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作…