整理mongodb文档:事务(一)

这篇具有很好参考价值的文章主要介绍了整理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的钱准备好,各自都准备十块钱给他们

整理mongodb文档:事务(一),mongodb,数据库

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

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

const sql = async () => {
// 链接db
    const mongoose = require('mongoose');
    mongoose.connect('mongodb://localhost:27018/test')
    // 定义schema
    const 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();

直接运行之后,可以看到数据库被更改如下:
整理mongodb文档:事务(一),mongodb,数据库

而由于存在错误,导致我们的代码无法更改b的数据
整理mongodb文档:事务(一),mongodb,数据库

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

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

const sql = async () => {
    // 链接db
    const mongoose = require('mongoose');
    mongoose.connect('mongodb://localhost:27018/test')
    // 创建一个会话
    const mySession = await mongoose.startSession();
    //开始事务
    mySession.startTransaction()
    // 定义schema
    const 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();

最终的效果如下

整理mongodb文档:事务(一),mongodb,数据库

在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开始,多文档事务(无论是在分片集群上还是副本集上)也称为分布式事务。文章来源地址https://www.toymoban.com/news/detail-697516.html

到了这里,关于整理mongodb文档:事务(一)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【MongoDB】数据库、集合、文档常用CRUD命令

    目录 一、数据库操作 1、创建数据库操作 2、查看当前有哪些数据库 3、查看当前在使用哪个数据库 4、删除数据库 二、集合操作 1、查看有哪些集合 2、删除集合 3、创建集合 三、文档基本操作 1、插入数据 2、查询数据 3、删除数据 4、修改数据 四、文档分页查询 五、文档其

    2024年02月13日
    浏览(43)
  • 通过Studio 3T对Mongodb进行 创建数据库/集合 增删查改集合文档操作

    首先 你需要安装Studio 3T 以及启动 Mongodb服务 具体可以参考我的文章 Studio 3T客户端连接Mongodb数据库服务 我们之前 通过 随便输切换是可以的 但除了这里能看到的 它们都仅存在于内存 我们右键顶部菜单 选择 添加数据库/创建数据库 这里 我们输入数据库名称 然后 点击OK 这样

    2024年02月01日
    浏览(56)
  • H2数据库配置及相关使用方式一站式介绍(极为详细并整理官方文档)

    注意:可以直接移步至【2. H2数据库实战】目录下进行对H2数据库的快速使用 1.1 H2数据库介绍 官方文档地址: http://www.h2database.com/html/main.html H2的开发始于2004年5月, 但它在2005年12月14日首次发表。 H2的原作者Thomas Mueller也是Hypersonic SQL的原始开发者。 2001年,他加入PointBase公司

    2024年02月13日
    浏览(43)
  • 整理mongodb文档:find方法查询数据

    整理mongodb文档:find方法查询数据 求关注,求批评,求指出,如果哪儿不清晰,请指出来,谢谢 如题,本文讲的是如何用find查询数据,如何在数组、字段、对象中查询,以及‘或’等查询操作,最后讲了一些参数。依旧是在shell下操作。 查询数据是db操作中很重要的一步,而

    2024年02月13日
    浏览(35)
  • 数据库——事务,事务隔离级别

    什么是事务? 事务是逻辑上的一组操作,要么都执行,要么都不执行。 事务最经典也经常被拿出来说例子就是转账了。假如小明要给小红转账1000元,这个转账会涉及到两个关键操作就是:将小明的余额减少1000元,将小红的余额增加1000元。万一在这两个操作之间突然出现错误

    2024年02月11日
    浏览(43)
  • [虚幻引擎 MongoDB Client 插件说明] DTMongoDB MongoDB数据库连接插件,UE蓝图可以操作MongoDB数据库增删改查。

    本插件可以在UE里面使用蓝图操作MongoDB数据库, 对数据库进行查询,删除,插入,替换,更新操作。 插件下载地址在文章最后。 Create MongoDB Client - 创建客户端对象 创建一个 MongoDB 客户端对象。 Connect By Url - 连接到数据库 Url :MongoDB的连接地址。 如 mongoDB://account:password@ip:

    2024年02月14日
    浏览(91)
  • MongoDB数据库从入门到精通系列文章之:MongoDB数据库百篇技术文章汇总

    MongoDB数据库系列文章持续更新中: 更多数据库内容请阅读博主数据库专栏,数据库专栏涵盖了Mysql、SQLServer、PostgreSQL、MongoDB、Oracle、Cassandra等数据库 数据库专栏 文章名称 文章链接 数据库安装部署系列之:部署Mongodb5.0.6高可用集群详细步骤 数据库安装部署系列之:部署M

    2024年02月11日
    浏览(54)
  • redis数据库和MongoDB数据库基本操作

    (1) 设置键值 (2) 读取键值 (3) 数值类型自增1 (4) 数值类型自减1 (5) 查看值的长度 (1)对列表city插入元素:Shanghai Suzhou Hangzhou (2)将列表city里的头部的元素移除 (3) 对一个已存在的列表插入新元素 (4)查看list的值长度 (1) 设置一个hash表,order表里包括的

    2024年02月16日
    浏览(62)
  • Mongodb连接数据库

    npm init   npm i mongoose  const mongoose=require(\\\"mongoose\\\") mongoose.connect(\\\"mongodb://127.0.0.1:27017/user\\\") 说明:mongodb是协议,user是数据库,如果没有会自动创建user数据库 。 node 文件名     mongoose.disconnect()

    2024年02月15日
    浏览(59)
  • mongodb数据库操作

    1、启动mongodb 在mongodb启动命令中 --dbpath 指定mongodb的数据存储路径 --logpath 指定mongodb的日志存储路径 2、停止mongodb 第一步先进入mongo命令行模式 第二步,使用use admin 命令进入admin数据库 第三步,执行 db.shutdownServer()命令 停止服务。代码及显示如下:  2 、导出Mongodb数据 mon

    2024年02月09日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包