整理mongodb文档:事务(一)

个人博客

整理mongodb文档:事务(一)

原文链接,个人博客 求关注,本文主要讲下怎么在mongose下使用事务,建议电脑端看

文章概叙

本文的开发环境为Nodejs,在‘单机模式’讲解最基本的事务概念。并没有涉及分片以及集群,后续会在介绍完副本集、分片集群之后补充。

关于事务

事务是数据库维护数据一致性的单位,在每个事务结束时,都能保持数据一致性。

单单看概念,是很难有啥理解的。因此,我们先看看事务的四大特征,也就是经常看到的"ACID"。

原子性(Atomicity):事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行。

一致性(Consistency):事务应确保数据库的状态从一个一致状态转变为另一个一致状态。一致状态的含义是数据库中的数据应满足完整性约束。

隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务的执行。

持久性(Durability):已被提交的事务对数据库的修改应该永久保存在数据库中。

ACID四个概念,大概理解就可以了。即使是面试,也不一定会拿出来问,但是在这儿,能让我们更好的去理解事务。

基于ACID的四个内容,我们可以举一个经典的例子:转账。
比如a给b转6块钱,步骤就分为了从a的账号扣除6块钱,从b的账户增加6块钱,增加一个从a转1块钱到b的记录。这就是一个事务的流程,也满足了上面所说的四个特征。

由于本博客的编程语言是Javascript,所以本次示范会在Nodejs的环境下开发,对于其他的编程语言,建议在官网上看下

依赖版本

Transactions are new in MongoDB 4.0 and Mongoose 5.2.0. Transactions let you execute multiple operations in isolation and potentially undo all the operations if one of them fails.

这段是在Mongose的网站上搬运下来的,翻译就是:
事务在MongoDB 4.0和Mongoose 5.2.0中新增的。事务允许您独立地执行多个操作。如果其中一个操作失败,则可能会撤消所有操作。

"mongoose": "^7.5.0"

代码示范

首先,按照我们上面所述,我们需要准备一张表,并且将a还有b的钱准备好,各自都准备十块钱给他们

在这里插入图片描述

接下来,我们要写好两条sql。分别是a的账号中减少6块钱,以及b的账号增加6块钱的sql。

正常境况下,这儿可以用聚合,直接使用$add来更改钱数。但是为了演示的方便,手动将其设置为4以及16,不过下方会先人为的制造一个错误。请注意看第二十四行,本应该是16的,但我修改为了’aaa’,这就会导致出现一个错误,但是第一个sql执行成功了,a的数据被更改为了4

const sql = async () => {
// 链接dbconst mongoose = require('mongoose');mongoose.connect('mongodb://localhost:27018/test')// 定义schemaconst schema = new mongoose.Schema({ name: String, count: Number },{ collection: 'test' })// find方法查询await mongoose.model('test', schema).updateOne({ name: 'a' },{"$set": {count: 4}})await mongoose.model('test', schema).updateOne({ name: 'b' },{"$set": { count: 'aaa' }})
}
sql();

直接运行之后,可以看到数据库被更改如下:
在这里插入图片描述

而由于存在错误,导致我们的代码无法更改b的数据
在这里插入图片描述

接下来,在我们恢复数据之后,使用事务来修改下我们的代码。

其中,我们依旧保留了28行的错误,以验证事务的ACID。修改的代码如下。

const sql = async () => {// 链接dbconst mongoose = require('mongoose');mongoose.connect('mongodb://localhost:27018/test')// 创建一个会话const mySession = await mongoose.startSession();//开始事务mySession.startTransaction()// 定义schemaconst schema = new mongoose.Schema({ name: String, count: Number },{ collection: 'test' })try {await mongoose.model('test', schema).updateOne({ name: 'a' },{"$set": {count: 4}}).session(mySession);await mongoose.model('test', schema).updateOne({ name: 'b' },{"$set": { count: 'aaa' }}).session(mySession);// 提交事务await mySession.commitTransaction();console.log('事务结束');} catch (error) {console.log("事务出错了,即将回滚");// 事务回滚await mySession.abortTransaction();}mySession.endSession();}
sql();

一开始,我们创建了一个会话,并开始它的事务。

// 创建一个会话
const mySession = await mongoose.startSession();
//开始事务
mySession.startTransaction()

接着在每一个我们需要绑定的sql中添加到会话去

await mongoose.model('test', schema).updateOne({ name: 'b' },{"$set": { count: 'aaa' }}).session(mySession);

在完成了我们的事务后,我们需要将其提交上去

await mySession.commitTransaction();

如果失败后,我们需要回滚事务,取消掉我们的事务

await mySession.abortTransaction();

最后要有始有终,结束我们的会话

mySession.endSession();

最终的效果如下

在这里插入图片描述

在Mongoose下,事务便是如此,而不会将成功的sql应用到数据库中的原因是事务中的某个文档后来失败,所以该文档中的更改不会保存到MongoDB。并且该函数通知 Mongoose 更改跟踪已回滚,并将事务中更改的所有字段标记为已修改。
至此,在mongodb中的事务,我们已经通过session来实现了。建议自己敲下代码,理解下。

注意点

1.mongodb的事务是4.0以上才支持的,如果项目是很老很老的,建议小心测试再上线。部分老玩家玩mongodb很久的了,会说mongodb没有事务,也是因为4.0以上才有的.
2.在MongoDB 4.0中,仅使用WiredTiger存储引擎的副本集支持事务,如果有条件,个人建议是在4.2以上的版本开发测试。

3.分布式事务是指分片集群和副本集上的多文档事务,从MongoDB 4.2开始,多文档事务(无论是在分片集群上还是副本集上)也称为分布式事务。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

垃圾回收 - 标记压缩算法

压缩算法是将标记清除算法与复制算法相结合的产物。 1、什么是标记压缩算法 标记压缩算法是由标记阶段和压缩阶段构成。 首先,这里的标记阶段和标记清除算法时提到的标记阶段完全一样。 接下来我们要搜索数次堆来进行压缩。压缩阶段通过数次搜索堆来重新填充活动对…

C#,《小白学程序》第十五课:随机数(Random)第二,统计学初步,数据统计的计算方法与代码

1 文本格式 /// <summary> /// 《小白学程序》第十五课&#xff1a;随机数&#xff08;Random&#xff09;第二&#xff0c;统计学初步&#xff0c;数据统计的计算方法与代码 /// 用随机数做简单的统计并用图形显示统计结果。 /// </summary> /// <param name&q…

vue中v-for循环数组使用方法中splice删除数组元素(每次都删掉点击的下面的一项)

总结&#xff1a;平常使用v-for的key都是使用index&#xff0c;这里vue官方文档也不推荐&#xff0c;这个时候就出问题了&#xff0c;我们需要key为唯一标识&#xff0c;这里我使用了时间戳&#xff08;new Date().getTime()&#xff09;处理比较复杂的情况&#xff0c; 本文章…

2020年12月 C/C++(一级)真题解析#中国电子学会#全国青少年软件编程等级考试

C/C编程&#xff08;1~8级&#xff09;全部真题・点这里 第1题&#xff1a;字符三角形 描述 给定一个字符&#xff0c;用它构造一个底边长5个字符&#xff0c;高3个字符的等腰字符三角形。 输入 输入只有一行&#xff0c; 包含一个字符。 输出 该字符构成的等腰三角形&#xff…

C++ - 多态的实现原理

前言 本博客主要介绍C 当中 多态语法的实现原理&#xff0c;如果有对 多态语法 有疑问的&#xff0c;请看下面这篇博客&#xff1a; C - 多态语法 - 虚函数使用介绍-CSDN博客 探究&#xff0c;为什么多态的条件是那样的&#xff08;虚函数表&#xff09; 首先&#xff0c;调用…

qt day6 人脸识别

在C和C中static关键字的用法 static修饰局部变量、全局变量&#xff08;不能被外部引用extern|未初始化的值为0&#xff09;、函数&#xff08;不能被外部引用extern&#xff09;&#xff0c;不能修饰auto类型的指针&#xff08;因为计算机先为静态变量分配空间&#xff0c;后再…

重磅|Falcon 180B 正式在 Hugging Face Hub 上发布!

引言 我们很高兴地宣布由 Technology Innovation Institute (TII) 训练的开源大模型 Falcon 180B 登陆 Hugging Face&#xff01;Falcon 180B 为开源大模型树立了全新的标杆。作为当前最大的开源大模型&#xff0c;有180B 参数并且是在在 3.5 万亿 token 的 TII RefinedWeb 数据…

打造基于终端命令行的IDE,Termux配置Vim C++开发环境

Termux配置Vim C开发环境&#xff0c;打造基于终端命令行的IDE 主要利用VimCoc插件&#xff0c;配置C的代码提示等功能。 Termux换源 打开termux&#xff0c;输入termux-change-repo 找到mirrors.tuna.tsinghua.edu.cn&#xff0c;清华源&#xff0c;空格选中&#xff0c;回…

Hadoop Hive入门

0目录 1.linux 安装hive 2.hive入门 3.hive高级语法1 1.linux 安装hive 先确保linux虚拟机中已经安装jdk&#xff1b;mysql和hadoop 并可以成功启动hadoop和mysql 下载hive对应版本到opt/install目录下并解压到opt/soft目录下 重命名 hive312 配置profile 文件&#xff…

Qt+C++桌面计算器源码

程序示例精选 QtC桌面计算器源码 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对<<QtC桌面计算器源码>>编写代码&#xff0c;代码整洁&#xff0c;规则&#xff0c;易读。 学习与…

Hadoop的第二个核心组件:MapReduce框架第二节

Hadoop的第二个核心组件&#xff1a;MapReduce框架第二节 六、MapReduce的工作流程原理&#xff08;简单版本&#xff09;七、MapReduce中的序列化机制问题八、流量统计案例实现&#xff08;序列化机制的实现&#xff09; 六、MapReduce的工作流程原理&#xff08;简单版本&…

Flutter实用工具Indexer列表索引和Search搜索帮助。

1.列表索引 效果图&#xff1a; indexer.dart import package:json_annotation/json_annotation.dart;abstract class Indexer {///用于排序的字母JsonKey(includeFromJson: false, includeToJson: false)String? sortLetter;///用于排序的拼音JsonKey(includeFromJson: fal…

如何有效防止服务器被攻击?

随着互联网的快速发展&#xff0c;服务器安全问题日益引起人们的关注。近期&#xff0c;全球范围内频繁发生的服务器攻击事件引发了广泛关注。为了保护企业和个人的数据安全&#xff0c;有效防止服务器被攻击已成为迫在眉睫的任务。 首先&#xff0c;及时更新服务器的操作系统和…

基于SpringBoot的医院挂号系统

基于SpringBootVue的医院挂号、预约、问诊管理系统&#xff0c;前后端分离 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBoot、Vue、Mybaits Plus、ELementUI工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 角色&#xff1a;管理员、用户、医生 管…

系统架构技能之设计模式-组合模式

一、上篇回顾 我们上篇主要讲述了结构型模式中的外观模式&#xff0c;外观模式作为结构型模式中的一个简单又实用的模式&#xff0c;外观模式通过封装细节来提供大粒度的调用&#xff0c; 直接的好处就是&#xff0c;封装细节&#xff0c;提供了应用写程序的可维护性和易用性。…

十二、集合(4)

本章概要 集合 Set映射 Map队列 Queue 优先级队列 PriorityQueue 集合与迭代器 集合Set Set 不保存重复的元素。 如果试图将相同对象的多个实例添加到 Set 中&#xff0c;那么它会阻止这种重复行为。 Set 最常见的用途是测试归属性&#xff0c;可以很轻松地询问某个对象是否…

命名空间的详讲

本篇文章旨在讲解C中命名空间的概念以及其相关注意事项&#xff01; C的介绍 C作为C语言的衍生&#xff0c;其对C语言中的一些缺陷进行了一些的补充和优化。但是C也对C语言具有兼容性&#xff01; 本文旨在讲解C对C语言中当声明的变量与库函数的一些标识符&#xff0c;关键字…

【数论】容斥问题教程+符号含义+公式(c++)

容斥问题是什么 比如我们平常考试&#xff0c;我们会统计有几个语文及格&#xff0c;有几个数学及格&#xff0c;比如5个语文及格&#xff0c;2个数学及格&#xff0c;当然了&#xff0c;也会有大学霸两科都及格&#xff0c;比如1个人语文数学都及格&#xff0c;那我们班上一共…

Hadoop的第二个核心组件:MapReduce框架第四节

Hadoop的第二个核心组件&#xff1a;MapReduce框架 十、MapReduce的特殊应用场景1、使用MapReduce进行join操作2、使用MapReduce的计数器3、MapReduce做数据清洗 十一、MapReduce的工作流程&#xff1a;详细的工作流程第一步&#xff1a;提交MR作业资源第二步&#xff1a;运行M…

vnc与windows之间的复制粘贴

【原创】VNC怎么和宿主机共享粘贴板 假设目标主机是linux&#xff0c;终端主机是windows&#xff08;就是在windows上使用VNC登陆linux&#xff09; 在linux中执行 vncconfig -nowin& 在linux选中文字后&#xff0c;无需其他按键&#xff0c;直接在windows中可以黏贴。 …