当前播放: 22 | 事务开发:多文档事务
00:00 / 00:00
高清
  • 高清
1.0x
  • 2.0x
  • 1.5x
  • 1.25x
  • 1.0x
  • 0.5x
网页全屏
全屏
00:00
付费课程,可试看
课程目录
第一章:MongoDB再入门 (12讲)
01 | 课程介绍
免费
02 | 内容综述
免费
03 | 认识文档数据库MongoDB
免费
04 | MongoDB特色及优势
免费
05 | 实验:安装MongoDB
免费
06 | MongoDB基本操作
07 | 实验:Hello World程序开发
08 | 聚合查询
09 | 实验:聚合查询
10 | 复制集机制及原理
11 | 实验:搭建MongoDB复制集
12 | MongoDB全家桶
第二章:从熟练到精通的开发之路 (12讲)
13 | 模型设计基础
14 | JSON文档模型设计特点
15 | 文档模型设计之一:基础设计
16 | 文档模型设计之二:工况细化
17 | 文档模型设计之三:模式套用
18 | 设计模式集锦
19 | 事务开发:写操作事务
20 | 事务开发:读操作事务之一
21 | 事务开发:读操作事务之二
22 | 事务开发:多文档事务
23 | Change Stream
24 | MongoDB开发最佳实践
第三章:分片集群与高级运维之道 (6讲)
25 | 分片集群机制及原理
26 | 分片集群设计
27 | 实验:分片集群搭建及扩容
28 | MongoDB监控最佳实践
29 | MongoDB备份与恢复
30 | 备份和恢复操作
22 | 事务开发:多文档事务

22 | 事务开发:多文档事务

唐建法(TJ)
Tapdata CTO、MongoDB中文社区主席、前MongoDB大中华区首席架构师
47讲 约500分钟3552
单独订阅¥129
2人成团¥99
本节摘要

下次更新时间为:2020 年 1 月 1 日
课件和 Demo 地址
https://github.com/geektime-geekbang/geektime-mongodb-course

展开
登录 后留言

精选留言(6)

  • 长期规划
    老师,网上看到的文章都说MySQL比MongoDB的最大优势是支持事务(多表),但现在MongoDB 4.0之后已经支持多文档事务了,那我感觉MySQL相对MongoDB来说就没啥优势了,当然,MySQL有外键,join等更强大一些,但这些特性一般不是选择MySQL是根本原因。我感觉所有场景下,都可以用MongoDB代替MySQL,是这样吗

    作者回复: 你要问我,肯定是了。从CRUD操作来说,JSON 数据库更加方便。支持事务以后,现在MongoDB剩下的就是 做BI分析了这一块可能还不算太强。

    2019-12-22
    1
    1
  • 长期规划
    MongoDB还是很厉害的,一开始就支持单文档事务,4.0支持多文档事务,4.2支持有分片的分布式事务。不过,单文档事务这叫法有点鸡肋,虽然也的确是事务,但一般我们讲事务时,默认是指多文档的,对比MySQL就是多行。如果我在3.2中用两条更新语句更新一个文档,那应该也不是事务吧?单文档事务这叫法,给人感觉在一个文档上执行多条DML,使用的一个事务,但其实不是。另外,MongoDB在没有显式使用事务语句时,应该就是自动提交吧。

    作者回复: 这个单文档事务叫法背后的逻辑:

    关系型里面,用户表和用户电话是分开在两张表。当你需要新增一个新用户,你需要:
       insert into USER
       insert into PHONE
    这两个DML需要放在事务范围内,保证两条数据(其实是一条,用户数据)要么一起成功写入,要么回滚。

    在MongoDB里面,类似的操作变成了一个单文档操作:

       db.user.insert({ name: "TJ",phone: ["1234"]})

    这个操作里面其实相当于做了两个事情:1) 添加用户 2) 添加电话号码。这两个事情是有原子事务性的-要么一起成功,要么一起失败。

    这个是mongo单文档事务的由来。



    2019-12-19
    1
    1
  • 遛弯的台球
    老师您好,可重复读Repeatable Read我是理解为事务内的查询操作在事务提交之前,对事务外的更新操作无感知,还是可以查到之前的数据,我尝试了一下,即使事务启动session.startTransaction(),不加readConcern: {level: "snapshot"}也是可以实现
    2019-12-31
  • Mao
    事务引入的初衷,是为了解决有多个事务同时执行的时候,就可能出现脏读(dirty read)、
    不可重复读(non-repeatable read)、幻读(phantom read)的问题

    MongoDB的事务分为:
    available:读取所有可用的数据
    local:读取所有可用且属于当前分片的数据
    majority:读取在大多数节点上提交完成的数据
    linearizable:可线性化读取文档
    snapshot:读取最近快照中的数据

    MySQL的事务分为:
    读未提交(read uncommitted)
    读提交(read committed)
    可重复读(repeatable read)
    串行化(serializable )

    按照字面理解,无论是MongoDB还是MySQL,它们引入事务似乎都是为了解决“读”的问题。

    但是我们的项目中,是在多文档/表 的insert、update、remove 这些“非读”的场景下使用。

    那么我是否应该理解为,所谓的事务,是MongoDB/MySQL 的service层在执行 insert、update、remove

    操作前,对已有数据的一个验证呢?

    作者回复: 事务性有ACID四个属性,你上面讲的是ACID里面的I, Isolation。Isolation隔离性关注的就是跟读相关的事情。

    你说的增删改事务,多半是和A相关,Atomicity,原子性。一起提交,或者全部回滚。

    2019-12-29
  • 蓝魔丶

    事务写冲突MongoDB的处理方式为什么会有事务内about和事务外等待两种处理方式,为什么不与关系数据库mysql处理方式一样不管事务内还是事务外都采用等待超时的策略,mysql会在写冲突时等待一定的时间,而且保证是当前读操作,能够保证事务更新的正确性,如果等待超时,则会直接crash掉这个事务并不会像MongoDB这样报错about还没有清除事务,需要手动删除,这种方式好吗?

    作者回复: 这个反馈可以去jira.mongodb.org 去提一个Issue,属于产品建议。

    2019-12-24
  • 月迷津渡
    提问个问题再Repeatable Read这例子里 先启动事务 然后事务外修改数据,事务内的多次读操作永远读到的是启动事务时的snapshot(x:1, y:1)。那我的问题是当事务这时提交时 是不是先拿事务内的修改(比如说改成{x:2,y:1})和事务外的修改比如说改成(x:1:y2)两者做合并然后没冲突的话再提交。最后记录是{x:2,y:2}
    2019-12-19
收起评论
看过的人还看
Elasticsearch核心技术与实战

阮一鸣  eBay Pronto平台技术负责人

100讲 | 17010 人已学习

拼团 ¥99 原价 ¥129
设计模式之美

王争  前Google工程师,《数据结构与算法之美》专栏作者

100讲 | 18606 人已学习

拼团 ¥129 原价 ¥199
后端技术面试38讲

李智慧  同程艺龙交通首席架构师,前Intel&阿里架构师,《大型网站技术架构》作者

38讲 | 3804 人已学习

¥99
MySQL实战45讲

林晓斌  网名丁奇,前阿里资深技术专家

48讲 | 44255 人已学习

拼团 ¥79 原价 ¥99