mongodb一致性协议_mongo的怎么保持事物的一致性-问答-阿里云开发者社区-阿里云...

http://docs.mongoing.com/manual-zh/tutorial/perform-two-phase-commits.html

要么操作全都执行,要么都不执行,不能执行一半,改了几条数据了,看哎哟好像不对,那扔着吧。Consistency 在数据库领域的意思跟在分布式系统里的意思不一样,指数据的外部约束有没有满足,比如帐户之间转账,不能最后总和还是负数,或者超过原来的总和了。

那文档中的办法是怎么做的呢?简单说,就是在执行操作之前,记下来要做什么,以后可以 redo。然后保证每个操作都是 幂等的 ,就是说重复执行也没事。比如,赋值是幂等的,但是加一个数就不是幂等的。利用 MongoDB 提供的单文档的原子性,使用一些辅助的数据做到幂等,最后把辅助的数据清除掉。如果你的操作本身就是幂等的,那就不需要辅助数据了。如果要 undo,也是可能的,那就要记下如何 undo。

但是 ACID 中的 Isolation 是没有的,也就是说事务之间有交叉,别的并发操作可以看到中间不一致的状态,上面说的外部约束只能最终得到保证。比如说,事务 T1 包括 (张三:加100;李四:减100),事务 T2 包括 (张三:加200;李四:减200),如果不加以限制,可能的顺序是:

1.T1 (张三:加100)

2.T2 (张三:加200)

3.T2 (李四:减200)

4.T1 (李四:减100)

T2 执行的时候可以读取并修改 T1 的中间结果,在转账这个问题上没有大问题,因为加减是 可交换 的操作,先后不影响最终结果。但是如果我们把事务改成 T1 (张三 = 100;李四 = 100)和T2 (张三 = 200;李四 = 200) 这样最终的结果就可能是 (张三 = 200;李四 = 100),有可能就不满足一致性了。但是如果能在应用里保证顺序地执行这两个事务,问题就避免了。

大家也了解 Isolation 有几个级别,还有多版本等更复杂的。传统数据库在单机上也会在更强的 Isolation 和性能之间做权衡,提供不同的级别可选。这一点在分布式系统中被称作 Consistency,实现起来的代价就更高了,所以 MongoDB 不支持。不过对大多应用,这并不是太大的问题:

1.可能异常情况在逻辑上也是可以接受的,比如微信群发,每个人收到的顺序并不一样。

2.可能逻辑上并发就是不可能的,比如一个用户只能修改自己的数据,比如只有一个线程写数据。

3.或者把需要的数据放到一个文档里,对单文档,MongoDB 保证原子性,别的操作也不可能看到文档一半被改了。

4.或者可以在应用上层发现并解决。比如支付宝转账就自己实现了一套一致性协议,1分钟之内可以保证这一笔数据一致了。

对你的要求,如果可以通过修改数据模型,让改动在一个文档里就方便了。最好是看看你具体的需要和应用的假设,分析分析可能出现的异常情况,最后想办法。还有一个办法,贵司可以购买 MongoDB 的支持服务,针对你现在的产品阶段和需求 (开发,维护,咨询,培训),提供不同类型的专业级支持,比再请个程序员 / DevOp / DBA 便宜靠谱多了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/340618.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

picturectrl控件中加载图片并显示_在 CRA 中使用 webp 图片提升加载性能

webp 是 google 提倡的一种新的 image 格式,意在为 web 提供体积更小的图片格式。通常情况下,无损压缩可以减小 25%-35% 的体积(有例外情况,反而会增大体积,但是是因为转换图片格式不兼容引起的)&#xff0…

怎么打开网卡rss_RSS 进阶篇:Huginn - 真·为任意网页定制 RSS 源(PhantomJs 抓取)...

定制网页RSS源主要有FEED43和Huginn两种方法。FEED43:简单免费,六小时抓取一次,每次抓取20条静态页面。使用攻略- RSS 入门篇:FEED43&FeedEx-为静态网页定制 RSS 源2. Huginn:自由度高,可设定抓取频率、…

编写junit 测试_编写JUnit测试的另一种方法(Jasmine方法)

编写junit 测试最近,我为一个小型个人项目编写了很多Jasmine测试。 我花了一些时间才终于感到正确地完成了测试。 在此之后,当切换回JUnit测试时,我总是很难过。 由于某种原因,JUnit测试不再那么好,我想知道是否有可能…

python4 什么时候_Python4要来了?快来看看Python之父怎么说

大家好,我是菜鸟哥,今天跟大家一起聊一下Python4的话题!从2020年的1月1号开始,Python官方正式的停止了对于Python2的维护。Python也正式的进入了Python3的时代。而随着时间的发展,关于Python4的发布也逐渐的成为了大家…

python类成员变量_Python 类变量和成员变量

Python 类变量和成员变量类与对象的方法我们已经讨论了类与对象的功能部分,现在我们来看一下它的数据部分。事实上,它们只是与类和对象的名称空间 绑定 的普通变量,即这些名称只在这些类与对象的前提下有效。有两种类型的 域 ——类的变量和对…

JDK 14 – JEP 361从预览中切换表达式

在我以前的文章中 ,我写了有关作为JDK 12的预览功能发布的开关表达式和相关增强功能的信息。随后,在JDK 13中提出了一些更改,例如使用yield关键字从switch块返回值并在预览中发布。 在即将于明年3月在GA上发布的即将发布的JDK 14版本中&…

输入一个正整数求所有素数因子_一个数如果恰好等于它的因子之和,这个数就称为完数。编写应用程序求1000以内所有的完数...

运行截图&#xff1a;代码import java.util.*;public class wanshu {public static void main(String args[]) {int sum 0,i,j,k,m 0;System.out.println(" 完数有&#xff1a;");for( j 2; j < 1000 ; j){for ( i 2 ; i < j; i){if( j%i 0) //此判…

安卓禁用硬件加速_Android硬件加速详解

从Android3.0(API Level 11)开始&#xff0c;支持硬件加速&#xff0c;可充分利用GPU的特性&#xff0c;使得界面渲染更加平滑。但是硬件加速自身并非完美&#xff0c;在某些Webview版本上&#xff0c;比如Android5初期的一些rom上的Webview版本是chrome37、38版本&#xff0c;…

mac svn工具_程序员或产品经理,这些Mac的效率工具一定不要错过

工欲善其事必先利其器!用好工具能很大的提高我们的工作效率&#xff0c;尤其是程序员和产品经理等。今天给大家介绍一些好用的工具随时记下闪现的灵感人的一天中大脑会产生大约6万个想法, 其中有不少优秀的 idea. 如果我们能学会捕捉哪怕是部分灵感, 也将会收获巨大. 因此工作中…

案例 github_github 项目搜索技巧-让你更高效精准地搜索项目

作者&#xff1a;Suwanbinwww.cnblogs.com/suwanbin/p/12113751.htmlgithub 搜索技巧参考自 B站 up 主 CodeSheep 的视频【如何高效地在网上找开源项目做&#xff01;在职程序员实际演示一波视频教程操作】&#xff0c;然后写着写着一好奇就去看文档了现在这篇博客相当于官方文…

使用Spring和JSR 303进行方法参数验证

Spring提供了一种使用JSR 303 bean验证来验证方法参数的简便方法。 在这篇文章中&#xff0c;我们将看到如何使用此功能。 设定 首先&#xff0c;我们需要通过创建MethodValidationPostProcessor bean添加对方法参数验证的支持&#xff1a; Configuration public class MyCon…

想要导航提示直接进入_北斗导航已开始提供全球服务,你的手机怎样连接北斗?...

如果你是新朋友&#xff0c;请点击上方的蓝色字 关注 “高科技爱好者”&#xff0c;保证不会让你失望的.自从北斗导航全球组网成功后&#xff0c;开始向全球提供导航服务&#xff0c;关于北斗导航的话题就没有断过&#xff0c;最常听到的两个话题&#xff1a;北斗收费吗&#x…

python3异步协程爬虫_Python实现基于协程的异步爬虫

Python实现基于协程的异步爬虫一、课程介绍1. 课程来源本课程核心部分来自《500 lines or less》项目&#xff0c;作者是来自 MongoDB 的工程师 A. Jesse Jiryu Davis 与 Python 之父 Guido van Rossum。项目代码使用 MIT 协议&#xff0c;项目文档使用 http://creativecommons…

python中变量的类型是动态的随时可以变化_python动态类型简介

1、a [1,2,3]其中a是变量名&#xff0c;[1,2,3]是对象&#xff0c;a通过一个指向[1,2,3]的指针引用了对象[1,2,3].2、每一个对象都有两个标准的头部信息&#xff0c;一个是标示这个对象的类型。另外一个是用来决定是不是可以回收这个对象。3、类型属于对象&#xff0c;而不属于…

jpa和hibernate_从JPA到Hibernate的旧版和增强型标识符生成器

jpa和hibernateJPA标识符生成器 JPA定义了以下标识符策略&#xff1a; 战略 描述 汽车 持久性提供程序选择基础数据库支持的最合适的标识符策略 身份 标识符由数据库IDENTITY列分配 序列 持久性提供程序使用数据库序列来生成标识符 表 持久性提供程序使用单独的数据库…

去掉前后空格_mysql批量去掉某个字段字符中的空格

mysql有什么办法批量去掉某个字段字符中的空格&#xff1f;不仅是字符串前后的空格&#xff0c;还包含字符串中间的空格&#xff0c;答案是 replace&#xff0c;使用mysql自带的 replace 函数&#xff0c;另外还有个 trim 函数。 &#xff08;1&#xff09;mysql replace 函数 …

python自己做个定时器_技术图文:如何利用 Python 做一个简单的定时器类?

原标题&#xff1a;技术图文&#xff1a;如何利用 Python 做一个简单的定时器类&#xff1f;背景今天在B站上看有关 Python 最火的一个教学视频 -- “零基础入门学习 Python”&#xff0c;这也是我们 Python基础刻意练习活动 的推荐视频教程。python视频在学习魔法方法的时候&a…

成为Java流大师–第6部分:使用流创建新的数据库应用程序

您是否曾经想开发数据库应用程序的“快速”版本&#xff1f; 在此动手实验文章中&#xff0c;您将学习一种真正简单而直接的方法。 整个Java域模型将自动为您生成。 您只需连接到现有数据库&#xff0c;然后开始使用Java流进行开发。 例如&#xff0c;您将能够在几分钟内为您现…

快速排序 挖坑_由浅入深玩转快速排序算法

由浅入深玩转快速排序算法快速排序可以说是最快的通用排序算法&#xff0c;它甚至被誉为20世纪科学和工程领域的十大算法之一。在众多排序算法中其无论是时间复杂度还是空间复杂度都颇具优势。作为开发工程师&#xff0c;我们很有必要了解它的思想。接下来将由在下为大家一步步…

代码拾取图片某一点的颜色_RPG游戏开发日志7:道具拾取与存放

本项目同步上传于github和coding上&#xff0c;国内读者可以通过在coding下载项目。也欢迎你加入我的UE4学习交流QQ群&#xff1a;872537977。如果你喜欢我写的文章&#xff0c;也希望你点赞、收藏、转发。谢谢&#xff01;如果你喜欢我写的文章&#xff0c;也希望你点赞、收藏…