写操作事务

writeConcern - w

writeConcern决定写操作落到多少节点上才算成功,其取值包括:

  • 0:发起写操作,不关心结果
  • n 1 <= n <= 集群最大数据节点数:写操作复制到n个节点才算成功。
  • majority: 写操作被复制到大多数节点才算成功
    发起写操作的线程将阻塞到写操作到达指定节点数才算成功;三节点复制集,默认是1,即主节点写好了就成了; 对于重要数据设置w:majority,对于普通数据设置w:1

语法:
db.test.insert({count:1}, {writeConcern:{w:3,wtimeout:3000}})

journal - j

journal决定写操作到什么程度才算成功

  • true: 写操作落到journal文件中
  • false: 写到内存就算成功

读操作事务

读数据,主要有两个问题:

  • 从哪里读?- readPreference
  • 什么样的数据可以读?(隔离性) - readConcern

readPreference

  • primary: 只从主节点读
  • primaryPreferred:优先主节点
    ?? 用户下单后转到订单详情页,可能从节点还没有复制到新订单
  • secondary: 只从从节点
    ?? 生成报表
  • secondaryPreferred: 从节点优先
    ?? 用户查询自己的历史订单
  • nearest: 选择最近的节点
    ?? 用户上传的图片分发到全世界

语法:
db.test.find({a:123}).readPref("secondary")

Tag

例如五节点复制集,三个硬件好一点的,打上tag"online",另外两个打上tag"analyse",生成报表只选择"analyse"节点,如图所示:

readConcern

这个节点上哪些数据是可以读的:

  • available: 所有可用数据
  • local:所有可用且属于当前分片
    local是默认值,在复制集上local和available无区别;只是在分片集上,当做chunk迁移时,只读当前分片,否则把还没迁移成功的另外个分片上迁移中的数据也读出来
  • majority:大多数节点提交完成的数据
    实现方式:和MySQL的MVCC类似,节点上保存多个版本的数据,根据需求返回不同版本数据。使用majority可以有效避免“脏读”。

首先,MongoDB对事务的支持更多指的是一个写操作能否被持久化下来,所以“提交”的概念就是,写到了多数节点(那么数据就不会丢失,永远持久化了),在这个层面上,读majority就不会“脏读”,读到的数据都是落到大多数节点的,而不会因为节点crash某个写操作在读之后丢失了(相当于回滚了)

  • linearizable:可线性化读取文档,保证该“读”能读到上一个“写”,保证操作的线性顺序
  • snapshot:读取最近快照中的数据 (隔离级别最高,相当于serializable)

安全的读写分离

readConcern和writeConcern配合实现安全的读写分离
??用户下单,并从从节点读订单数据:
不安全:

db.orders.insert({oid:100, sku:"kite", q:1})
db.orders.find({oid:100}).readPref("secondary")

安全:

db.orders.insert({oid:100, sku:"kite", q:1},{writeConcern:{w:"majority"}})
db.orders.find({oid:100}).readPref("secondary").readConcern("majority")

多文档事务

mongoDB 4.2之后全面支持了多文档事务,但是推荐还是能不用尽量不用,尽量通过合理的数据模型设计来规避事务的必要性。

语法:

try (ClientSession clientSession = client.startSession()) {
  clientSession.startTransaction();
  collection.insertOne(clientSession, docOne);
  collection.insertOne(clientSession, docTwo);
  clientSession.commitTransaction();
}

注意:

  • 多文档事务的读必须从主节点读
  • 使用MongoDB4.2兼容的驱动
  • readConcern只应该在事务级别设置,不能在每次读写操作上

标签智能推荐:

MongoDB

询优化器会分析查询表达式,并生成一个高效的查询计划高效的传统存储方式:支持二进制数据及大型对象(如照片或图片)Packages包说明MongoDB官方源中包含以下几个依赖包:mongodb-org:MongoDB元数据包,安装时自动安装下面四个组件包:1.mongodb-org-server:包含MongoDB守护进程和相关的配置和初始化脚本。2.mongodb-org-mongos:包含mong

centos7安装MongoDB3.4

&nbsp;简介MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。Packages包说明Mon

MongoDB基础:部署安装

包,如:sudoyuminstall-ymongodb-org-4.2.8mongodb-org-server-4.2.8mongodb-org-shell-4.2.8mongodb-org-mongos-4.2.8mongodb-org-tools-4.2.8若不想yum升级时MongoDB意外升级,可以配置/etc/yum.conf排除MongoDB:exclude=mongodb-org,m

3-11 说一下mysql和mongodb的区别?

模型mongodb-非关系型;mysql-关系型2、存储方式mongodb-以类JSON的文档的格式存储;mysql-不同引擎有不同的存储方式;3、查询语句mongodb-MongoDB查询方式(类似JavaScript的函数);mysql-SQL语句;4、数据处理方式mongodb-基于内存,将热数据存放在物理内存中,从而达到高速读写;mysql-不同引擎有自己的特点;5、成熟度mongodb-

mongodb geometry地理空间数据库存储和索引

一直以为mongodb不会在地理数据库上有太多作为,但是不是的。。mongodb是可以存储地理数据的,而且还有设计专门的函数来处理geojson数据,如$geometry:https://docs.mongodb.com/manual/reference/operator/query/geometry/MongoDB地理空间数据存储及检索:MongoDB要求把GeoJSON格式的数据以子文档的形式

在linux下安装MongoDB

86_64-rhel70-4.0.0//usr/local/mongodb&nbsp;&nbsp;3)&nbsp;移动完了之后把mongodb-linux-x86_64-rhel70-4.0.0的bin剪切到mongodb目录下5创建存储数据目录和日志文件目录&nbsp;&nbsp;1)mkdir–p/usr/local/mongodb/data/db&nbsp;&nbsp;2)mkdir–p/u

deepin20 安装MongoDB 5.0.2

ell=5.0.2mongodb-org-mongos=5.0.2mongodb-org-tools=5.0.2如果只安装mongodb-org=5.0.2而不指定组件包,则无论指定什么版本,都将安装每个MongoDB包的最新版本。尽管指定了MongoDB版本,但是apt-get将会在有新版本时升级包。为了防止意外升级,可以将包锁定在当前安装的版本上:echo"mongodb-orghold"|s

mongodb基础学习

tudent.drop()删除student集合Mongodb插入文档文档的数据结构和JSON基本一样。所有存储在集合中的数据都是BSON格式。BSON是一种类json的一种二进制形式的存储格式,简称BinaryJSON。MongoDB使用insert()或save()方法向集合中插入文档,语法如下:db.COLLECTION_NAME.insert(document)以下文档可以存储在Mongo

[MongoDB知识体系] 一文全面总结MongoDB知识体系

goDB进阶-性能优化:最后基于上述知识点,我们再了解下常见的性能优化的方式。Mongo进阶-性能:查询聚合优化在MongoDB中通过查询聚合语句分析定位慢查询/聚合分析学习资料下面是一些学习MongoDB的参考资料。@pdai官网资料最好的资料在官网。MongoDB官网MongoDB数据库文档MongoDB常用ShellMongoDBCRUDMongoDB聚合MongoDB数据模型MongoDB

MongoDB3.2.22快速入门与使用【未完待续】

ngodb-linux-x86_64-3.2.22mongodb1.3运行mongodb##创建数据库文件夹[root@localhost~]#mkdirmongodb/bin/db##运行mongodb##--httpinterface启用28017端口##--rest可以远程访问rest接口查看mongodb的状态##–storageEnginemmapv1存储引擎–storageEngine