MongoDB 高手课
唐建法(TJ)
Tapdata CTO、MongoDB 中文社区主席、前 MongoDB 大中华区首席架构师
19351 人已学习
新⼈⾸单¥59
课程目录
已完结/共 53 讲
MongoDB 高手课
登录|注册
留言
18
收藏
沉浸
阅读
分享
手机端
回顶部
当前播放: 22 | 事务开发:多文档事务
00:00 / 00:00
高清
  • 高清
1.0x
  • 2.0x
  • 1.5x
  • 1.25x
  • 1.0x
  • 0.75x
  • 0.5x
网页全屏
全屏
00:00
付费课程,可试看
01 | 课程介绍
02 | 内容综述
03 | 认识文档数据库MongoDB
04 | MongoDB特色及优势
05 | 实验:安装MongoDB
06 | MongoDB基本操作
07 | 实验:Hello World程序开发
08 | 聚合查询
09 | 实验:聚合查询
10 | 复制集机制及原理
11 | 实验:搭建MongoDB复制集
12 | MongoDB全家桶
13 | 模型设计基础
14 | JSON文档模型设计特点
15 | 文档模型设计之一:基础设计
16 | 文档模型设计之二:工况细化
17 | 文档模型设计之三:模式套用
18 | 设计模式集锦
19 | 事务开发:写操作事务
20 | 事务开发:读操作事务之一
21 | 事务开发:读操作事务之二
22 | 事务开发:多文档事务
23 | Change Stream
24 | MongoDB开发最佳实践
25 | 分片集群机制及原理
26 | 分片集群设计
27 | 实验:分片集群搭建及扩容
28 | MongoDB监控最佳实践
29 | MongoDB备份与恢复
30 | 备份与恢复操作
31 | MongoDB安全架构
32 | MongoDB安全加固实践
33 | MongoDB索引机制(一)
34 | MongoDB索引机制(二)
35 | MongoDB读写性能机制
36 | 性能诊断工具
37 | 高级集群设计:两地三中心
38 | 实验:搭建两地三中心集群
39 | 高级集群设计:全球多写
40 | MongoDB上线及升级
41 | MongoDB应用场景及选型
42 | MongoDB典型案例(一)
43 | MongoDB典型案例(二)
44 | 关系型数据库迁移
45 | 数据库迁移方式及工具
46 | Oracle迁移实战
47 | MongoDB + Spark实时大数据
48 | MongoDB + Spark连接实战
49 | MongoDB SQL套接件
50 | MongoDB与微服务
51 | MongoDB与数据中台
52 | MongoDB数据中台案例
53 | 结果测试&结束语
登录 后留言

全部留言(18)

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

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

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

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

2019-12-22
2
3
依乐祝
老师问下,chunk过程中各个分片上的oplog是会变化的吗?这时候oplog跟分片上的数据能对应起来吗?这部分日志是不是无用的日志啊

作者回复: 会产生日志。日志里有个特殊字段会标记出来是来自于chunk migration

2020-03-23
1
长脖子树
老师好, 我在本节课程最后的注意事项中看到, readConcern 只应该在事务级别中设置, 不能设置在每次读写操作上, 指的是在 session.startTransaction 中设置么? 为什么?

作者回复: 这个是设计如此,也是合理的。一个事务中,每个操作应用一样的隔离级别。

2020-02-23
1
cording
老师,我想请教一下mongodb有分布式事务锁吗?我想实现某一字段int值自增生成唯一主键

作者回复: 你这个不用分布式事务吧,用 findAndModify就可以实现了。

2020-02-23
2
1
cicoding
你好老师,mongodb在java中开启事务,会导致mysql的食物失效,这个怎么解决呢

作者回复: 不太明白你的问题,可以详细描述一些么

2020-03-09
一兵一卒
老师您好,可重复读Repeatable Read我是理解为事务内的查询操作在事务提交之前,对事务外的更新操作无感知,还是可以查到之前的数据,我尝试了一下,即使事务启动session.startTransaction(),不加readConcern: {level: "snapshot"}也是可以实现
2019-12-31
1
2
非洲黑猴子
上一节的这个操作: db.orders.find({oid:101}).readPref(“secondary”).readConcern("majority") 不就是把readConcern设置在了某一次读写操作上了?这是不是跟最后一条注意事项冲突了?谢谢
2023-01-09
收起评论