MongoDB事务机制

news2024/11/9 9:50:59

事务机制

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()

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ES6标准---【五】【看这一篇就够了!!!】

目录 ES6以往文章 箭头函数的基本用法 箭头函数的用处 简化回调函数 rest参数与箭头函数结合 箭头函数使用注意点 this指向的问题 其它不存在的变量 不能使用call()、apply()、bind()方法改变this的指向 箭头函数不适用场合 定义对象时,对象方法内部包含…

信创环境下源代码防泄露解决方案

在当今数字化时代,信息安全已成为企业生存与发展的基石,尤其是在信息技术应用创新(信创)环境下,数据保护更是被提升至前所未有的高度。SDC沙盒防泄露系统以其独特的技术架构和卓越的安全性能,在信创环境中构…

ES6标准---【六】【学习ES6标准看这一篇就够了!!!】

目录 以往ES6文章 前言 对象属性的简洁表示法 一个实际例子 简介写法在打印对象时也很有用 注意 对象属性名表达式 用表达式做属性名 用表达式定义方法名 注意 对象方法的name属性 对象属性的可枚举性和遍历 可枚举性 属性的遍历 属性比那里次序规则 super关键…

图片生成PPT!首推这款一站式AI制作PPT工具!

在当今快节奏的工作中,制作一份精美的PPT演示文稿往往是一项费时费力的工作,特别是当我们需要将大量的图片转化为PPT时,传统的方法显得尤为繁琐。幸运的是,随着AI人工智能技术的飞速发展,一种更便捷地将图片转为ppt的解…

计算机毕业设计 《计算机基础》网上考试系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…

Java之线程篇三

​​​​​​​ 目录 线程状态 观察线程的所有状态 线程状态及其描述 线程状态转换 代码示例1 代码示例2 线程安全 概念 线程不安全的代码示例 线程不安全的原因 线程安全的代码示例-加锁 synchronized关键字 synchronized的特性 小结 形成死锁的四个必要条件 …

Java设计模式之命令模式介绍和案例示范

一、命令模式简介 命令模式(Command Pattern)是一种行为型设计模式,它将请求封装为一个对象,从而使你可以用不同的请求对客户端进行参数化、对请求排队或记录日志,以及支持可撤销的操作。命令模式的核心思想是将发出请…

kvm 虚拟机命令行虚拟机操作、制作快照和恢复快照以及工作常用总结

文章目录 kvm 虚拟机命令行虚拟机操作、制作快照和恢复快照一、kvm 虚拟机命令行虚拟机操作(创建和删除)查看虚拟机virt-install创建一个虚拟机关闭虚拟机重启虚拟机销毁虚拟机 二、kvm 制作快照和恢复快照**创建快照**工作常见问题创建快照报错::intern…

超详细、史上最全pytorch安装教程

一、anaconda安装 1.下载 Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirrorhttps://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/ 这里划到最下面选择5.3.1最新版: 2.下载完成后安装 点击next 点击 I agree 选择All Us…

ignav的INS的状态更新

ignav的代码 static void updstat(const insopt_t *opt,insstate_t *ins,const double dt,const double *x0,const double *P0,double *phi,double *P,double *x,double *Q) {opt->exprn?getprn(ins,opt,dt,Q): getQ(opt,dt,Q); // //phi 状态转移矩阵 ,离散化…

算法学习攻略总结 : 入门至进阶,通关之路指南

❃博主首页 &#xff1a; <码到三十五> ☠博主专栏 &#xff1a; <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关> ♝博主的话 &#xff1a; <搬的每块砖&#xff0c;皆为峰峦之基&#xff1b;公众号搜索(码到…

CircleProgressView 鸿蒙ArkTS自定义View实现圆形进度条

上篇的截图中除了一个上下的箭头&#xff0c;还有一个圆形进度条&#xff0c;今天我们来讲讲这个如何进行实现 我们看这个图形的构造&#xff0c;其实很简单&#xff1a;一个圆形图形&#xff0c;以及一个文本来显示进度 所以我们用一个层叠布局 绘制一个带颜色的圆形&#xff…

『功能项目』播放动画时禁止点击移动【40】

我们打开上一篇39GameObject对象池 - 第三职业的项目&#xff0c; 本章要做的事情是在第三职业播放续航攻击动画时禁止点击时触发的移动函数&#xff0c;换句话说是在播放攻击动画时禁止移动 修改脚本&#xff1a;PlayerRayClickNavigation.cs 运行项目 - 播放第三职业续航技能…

2-92 基于matlab的KPCA的TE过程的故障监测

基于matlab的KPCA的TE过程的故障监测&#xff0c;利用核主元分析法(KPCA)来进行故障检测的思想,将输入空间中复杂的非线性问题转化为特征空间中的线性问题&#xff0c;计算步骤&#xff1a;&#xff08;1&#xff09; 选择监控变量&#xff0c;收集正常工况下的各变量的样本&am…

【警告 C6031:返回值被忽略:scanf】

警告 C6031 返回值被忽略: “scanf”。 错误 C4996 scanf: This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. #include <stdio.h> int max(int x, int y…

OKHttp实现原理分享

前言介绍 大约在2年半之前&#xff0c;就想写一篇关于OKHttp原理的文章&#xff0c;一来深入了解一下其原理&#xff0c;二来希望能在了解原理之后进行更好的使用。但是因为种种原因&#xff0c;一直无限往后推迟&#xff0c;最近因为我们情景智能半个月一次的分享轮到我了&…

手势识别&手势控制系统-OpenCV&Python(源码和教程)

项目特点 手部手势识别&#xff1a; 项目利用计算机视觉技术来识别手部的各种手势。这种技术可以应用于多种场景&#xff0c;比如人机交互、游戏控制、无障碍技术等。 自定义手势&#xff1a; 用户可以自定义手势&#xff0c;这意味着可以通过训练新的手势模式来扩展系统的功能…

基于vue框架的城市网约车管理系统v34td(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,司机,订单评价,完成订单,司机接单,打车订单 开题报告内容 基于Vue框架的城市网约车管理系统开题报告 一、研究背景与意义 1.1 研究背景 随着城市化进程的加速和互联网技术的飞速发展&#xff0c;网约车服务作为一种新兴的出行方…

基于java+SpringBoot+Vue的阿博图书馆管理系统设计与实现

开发语言:Java 数据库:MySQL技术:SpringBootMyBatis工具:IDEA/Ecilpse、Navicat、Maven 系统简介 阿博图书馆管理系统是一款基于Java、SpringBoot和Vue.js技术开发的信息化管理系统&#xff0c;旨在为图书馆提供一个高效、便捷的图书管理与借阅服务。系统通过B/S架构&#x…

FinalShell连接Linux服务器并解决反复输入密码问题

FinalShell是一款由国人开发的SSH客户端工具&#xff0c;它支持多平台&#xff0c;包括Windows、Mac OS X和Linux。FinalShell主要用于一体化服务器管理&#xff0c;它不仅是一个SSH客户端&#xff0c;还具备强大的开发和运维功能&#xff0c;能够充分满足开发和运维的需求。 本…