在MongoDB中, 文档级别的的写操作是原子性的, 甚至是在对某个文档的操作中修改其多个内嵌的子文档, 也是原子性的.

在一个写操作同时修改多个文档的情况, 对其中单独的某个文档而言是原子的, 但是对整批文档而言并不是原子的, 其他的

操作很可能会交错修改数据. 然而, 可以通过使用$isolated操作符, 隔离某个修改多个文档的写操作.

$isolated 操作符

通过使用$isolated操作符, 多文档写操作一旦开始写第一个文档,就会阻止其他进程交错修改. 这就确保了没有客户端可以看到数据变化, 直到写操作成功或者报错.

$isolated操作符不支持sharded clusters

然而 isolated 写操作无法提供 “all-or-nothing” 原子性的保障. 这意味着写操作出错时, 无法回滚发生错误之前的所有的变化.

注意: $isolated 操作符会导致写操作请求一个集合级别的排它锁, 即使使用了支持文档级别锁的 WiredTiger 存储引擎的情况下也一样. 这意味着, $isolated 操作符会使得 WiredTiger 在操作期间单线程化.

使用$isolated操作符的更新操作的例子, 请参见: $isolated
使用$isolated操作符删除操作的例子, 请参见: Isolate Remove Operations.

类事务语义

单个文档中可以内嵌多个子文档, 所以单文档原子性可以满足多数实际使用需求.对于涉及多文档的写操作序列必须作为一个单独的事务对待的情况,

可以在应用中实现一个two-phase commits 两步提交. 然而, two-phase commits只能提供类似事务的语义. 使用two-phase commits可以

确保数据的一致性(最终结果的一致性), 但是可能会使得应用程序(不小心)读到在two-phase commits或rollback期间产生的中间数据.

关于two-phase commit 和 rollback的更多信息, 请参见: Perform Two Phase Commits

并发控制

并发控制允许多个应用并发执行, 不会导致数据的不一致性或冲突. 方法一是在一个字段上创建一个唯一索引, 使得该字段只能有一个唯一的值. 这样

就避免了插入或更新时带来重复数据. 对于多个字段, 在其上创建唯一索引来强制这些个字段值组合的唯一性. 例子请参见 update() and Unique Index

和 findAndModify() and Unique Index. 另一个方法是为写操作在查询谓词中指定字段所期望的当前值, 具体例子请参见: Update if Current

two-phase commit 模式提供了一个变种, 在查询操作中, 其查询谓词中使用应用程序标识代替了某种期待的数据状态值.

原文:MongoDB: 原子性和事务

分布式事务-两阶-三阶段提交
mongodb拥有事务的解决方案
												

MongoDB: 原子性和事务的更多相关文章

  1. 在 MongoDB 上模拟事务操作来实现支付

    我们的产品叫「学海密探」,属于在线教育行业,产品需要有支付功能,然而支付最蛋疼是什么?有人会说是支付宝和微信等支付接口的接入开发!没错,但支付接口的开发算是比较简单的了,我觉得凡是跟钱有关系的操作最重 ...

  2. MongoDB 4.0 事务实现解析

    MongoDB 4.0 引入的事务功能,支持多文档ACID特性,例如使用 mongo shell 进行事务操作 > s = db.getMongo().startSession() sessio ...

  3. cassandra mongodb选择——cassandra:分布式扩展好,写性能强,以及可以预料的查询;mongodb:非事务,支持复杂查询,但是不适合报表

    Of course, like any technology MongoDB has its strengths and weaknesses. MongoDB is designed for OLT ...

  4. MongoDB 事务,复制和分片的关系

    摘要:本文尝试对Mongo的复制和分布式事务的原理进行描述,在必要的地方,对实现的正确性进行论证,希望能为MongoDB内核爱好者提供一些参考. 1.前言 MongoDB基于wiredTiger提供的 ...

  5. Redis的事务不是原子性的

    1.事务的四大特性 原子性(Atomicity):化学中的原子指不可再分的基本微粒,数据库中原子性强调事务是一个不可分割的整体,事务开始后所有操作要么全部成功,要么全部失败,不可能停滞在中间某个环节. ...

  6. 【翻译】MongoDB指南/CRUD操作(三)

    [原文地址]https://docs.mongodb.com/manual/ CRUD操作(三) 主要内容: 原子性和事务(Atomicity and Transactions),读隔离.一致性和新近 ...

  7. MongoDB基础

    1.概念及特点 说明:由于部分语句中$ 符号无法正常显示,使用¥代表 概念 MongoDB是一个基于文档的分布式的开源的NoSQL数据库,文档的结构为BSON形式,每一个文档都有一个唯一的Object ...

  8. [轉]redis;mongodb;memcache三者的性能比較

    先说我自己用的情况: 最先用的memcache ,用于键值对关系的服务器端缓存,用于存储一些常用的不是很大,但需要快速反应的数据 然后,在另一个地方,要用到redis,然后就去研究了下redis. 一 ...

  9. 关于mongodb ,redis,memcache

    先说我自己用的情况: 最先用的memcache ,用于键值对关系的服务器端缓存,用于存储一些常用的不是很大,但需要快速反应的数据 然后,在另一个地方,要用到redis,然后就去研究了下redis. 一 ...

随机推荐

  1. <iOS>一个开发中值得注意的细节

    UIScrollView有一个属性叫做scrollToTop,是个BOOL值,默认为YES. 它的作用是定义当前的这个UIScrollView的delegate<UIScrollViewDele ...

  2. 最值得一看的几条简单的谷歌 Google 搜索技巧,瞬间提升你的网络搜索能力

    可能你和我一样,几乎每天都必须与搜索引擎打交道,不过很多时候,你辛辛苦苦搜了半天也没找到合适的资料,然而“高手们”上来一眨眼功夫就能命中目标了.这并不是别人运气好,而是搜索引擎其实是有很多技巧可以帮助 ...

  3. CSS background 之设置图片为背景技巧

    首先先来看看background有那些值: 可以按顺序设置如下属性(可点击进入相应的css手册查看使用):background-color 背景颜色background-image 背景图片backg ...

  4. HTML&CSS精选笔记_HTML入门

    HTML入门 什么是HTML HTML基本文档格式 HTML文档的基本格式,其中主要包括<!DOCTYPE>文档类型声明.<html>根标记.<head>头部标记. ...

  5. Java精选笔记_自定义标签

    自定义标签 自定义标签入门 什么是自定义标签 自定义标签可以有效地将HTML代码与Java代码分离,从而使不懂Java编程的HTML设计人员也可以编写出功能强大的JSP页面 JSP规范中定义了多个用于 ...

  6. swift - UIScrollView 的使用

    本节详细介绍scrollview的用法 ———————————————————————————————————— UIScrollView 是一个能够滚动的视图控件,可以用来展示大量的内容,并且可以通 ...

  7. GIS-003-在线地图下载及应用

    目前在线地图有谷歌.高德.百度.Bing.soso.天地图.OpenStreet.ArcGIS Online等.在企业应用中,一般需要物理网络隔绝,就有必要下载地图数据之后模拟发布,可以选择下载谷歌影 ...

  8. Linux之expect

    一,安装expect yum install expect 其实expect根bash形势上差不多的. 二,实例 1,ssh实现自动登录,并停在登录服务器上 查看复制打印? #!/usr/bin/ex ...

  9. with操作符损耗性能的原因

    当函数运行是,创建一个[[scope]]指向的被称为作用域链的可变对象集合,作用域链的最前端是一个包含所有的局部变量.参数.this等的被称为“激活对象”的对象. 在标示符查找的过程中,从作用域的最前 ...

  10. 【黑金ZYNQ7000系列原创视频教程】01.熟悉vivado——纯逻辑led实验

    黑金论坛地址: http://www.heijin.org/forum.php?mod=viewthread&tid=36627&extra=page%3D1 爱奇艺地址: http: ...