mongodb的ACID特性与mysql,redis简单比较

原子性保证:All write operations in MongoDB are atomic on the level of a single document.
批量写,bulkwrite语法:针对同一个集合多个cud操作。不支持类似mysql的事务。无回滚。默认按顺序执行,出错返回未执行的操作。可以指定无序批量,mongo会并行执行,出错不会终止执行。
bulkWrite() supports the following write operations:
insertOne
updateOne
updateMany
replaceOne
deleteOne
deleteMany
持久化:写有同步与异步模式。通过参数调整在持久化与性能之间平衡。
{ w: <value>, j: <boolean>, wtimeout: <number> }

w:majority:写请求已被传播到多数节点,(含主节点)才确认。日志是否已持久化看参数j
j:true w指定数量节点或多数节点日志已持久化才确认。
读和写模式密切相关。写日志持久化与否影像到读的一致性。当j:false时,日志并未持久化到硬盘,只是在内存中,所以此时failover都有可能出现读不一致。
读:readPreference控制从复制集的哪个节点读取数据,这个特性可方便的实现读写分离、就近读取等策略。默认primiry。

readConcern 用来控制读一致性,用户可以在性能和一致性之间取舍

The readConcern option is available for the following operations:

    • find command
    • aggregate command and the db.collection.aggregate() method
    • distinct command
    • count command
    • parallelCollectionScan command
    • geoNear command
    • geoSearch command

为简化讨论,下面讨论基于w:majority,j:true,readPreference:primiry

常见场景:遍历find返回的cursor。

    • local 默认,总是读取最新的数据,表明客户端可以看到还未被持久化的数据。集群环境下,可能只有primiry完成写,而不是多数节点完成。这时primiry failover后再上线会回滚数据。(会出现读未提交。)
    • majority 返回已被多数节点写成功的数据。注意多数确认写成功可能不是最新的(因为最新的可能只有primiry成功了,而不是多数成功)。(隔离并发的未提交写)
    • linearizable ,返回已被多数节点确认为写成功,且早于本次读之前修改的数据(所有并发写都被隔离)。
  • mysql 提供多语句打包事务语法(begin,commit)事务是并行的,通过隔离级别来提供一致性,提供行锁来保证资源不会被并发修改。
  • redis提供多语句打包事务语法(multi,exec)事务是串行执行的,不会并发修改,不提供锁,但是通过watch机制保证在事务执行前资源被修改终止当前事务执行。另外因为串行事务的隔离界别,不会有并发修改。
  • mongo 无多语句事务语法。另外单条update涉及多文档时也非原子执行。find涉及多文档时可以通过readConcern进行并发修改隔离。不支持mysql中常见的多表多行的事务,也不支持单表多行事务,其批量语法可能部分成功,只能使用补偿机制,达到最终一致性。
  • mongo针对update涉及多文档时,提供的$isolated可以保证update多文档不会有并发访问。但是不提供回滚。(不支持分片集群。)
  • mongo的 two-phase commits 提供transaction-like semantics.
  • mongo建议使用唯一索引和版本控制并发。这在mysql中也很常见。
 
时间: 2024-11-05 22:05:24

mongodb的ACID特性与mysql,redis简单比较的相关文章

深入学习MySQL事务:ACID特性的实现原理

事务是MySQL等关系型数据库区别于NoSQL的重要方面,是保证数据一致性的重要手段.本文将首先介绍MySQL事务相关的基础概念,然后介绍事务的ACID特性,并分析其实现原理. MySQL博大精深,文章疏漏之处在所难免,欢迎批评指正. 一.基础概念 事务(Transaction)是访问和更新数据库的程序执行单元:事务中可能包含一个或多个sql语句,这些语句要么都执行,要么都不执行.作为一个关系型数据库,MySQL支持事务,本文介绍基于MySQL5.6. 首先回顾一下MySQL事务的基础知识. 1

一文教您如何通过 Docker 快速搭建各种测试环境(Mysql, Redis, Elasticsearch, MongoDB) | 建议收藏

原文:一文教您如何通过 Docker 快速搭建各种测试环境(Mysql, Redis, Elasticsearch, MongoDB) | 建议收藏 欢迎关注个人微信公众号: 小哈学Java, 文末分享阿里 P8 高级架构师吐血总结的 <Java 核心知识整理&面试.pdf>资源链接!! 个人网站: https://www.exception.site 小哈今天给大家分享的主题是,如何通过 Docker 快速搭建各种测试环境,本文列举的,也是小哈在工作中经常用到的,其中包括 Mysql

Nginx反向代理、动静分离、负载均衡及rewrite隐藏路径详解(Nginx Apache MySQL Redis)–第三部分

Nginx反向代理.动静分离.负载均衡及rewrite隐藏路径详解 (Nginx Apache MySQL Redis) 楓城浪子原创,转载请标明出处! 更多技术博文请见个人博客:https://fengchenglangzi.000webhostapp.com 微信bh19890922 QQ445718526.490425557 三.Nginx动静分离及负载均衡 3.1 Nginx安装 请参考:https://fengchenglangzi.000webhostapp.com/?p=511 亦

Redis 的 GEO 特性将在 Redis 3.2 版本释出

Redis 的 GEO 特性将在 Redis 3.2 版本释出, 这个功能可以将用户给定的地理位置信息储存起来, 并对这些信息进行操作. 本文将对 Redis 的 GEO 特性进行介绍, 说明这个特性相关命令的用户, 并在最后说明如何使用这些命令去实现"查找附近的人"以及"摇一摇"这两个功能. 版本要求 因为 Redis 目前的稳定版本为 Redis 3.0 , 而 GEO 特性是 Redis 3.2 版本的特性, 所以如果你想要使用这个特性的话, 那么就需要到 R

数据库的ACID特性

ACID,是指在数据库管理系统(DBMS)中事务所具有的四个特性:原子性(Atomicity).一致性(Consistency).隔离性(Isolation,又称独立性).持久性(Durability). 在数据库系统中,一个事务是指由一系列数据库操作组成的一个完整的逻辑过程.例如银行转帐,从原账户扣除金额,以及向目标账户添加金额,这两个数据库操作的总和构成一个完整的逻辑过程,不可拆分.这个过程被称为一个事务,具有ACID特性. 原子性 整个事务中的所有操作,要么全部完成,要么全部不完成,不可能

PHP 17: MySQL的简单介绍

原文:PHP 17: MySQL的简单介绍 这一章将简单介绍MySQL的基本知识. 本文来自http://lib.hackbase.com/html/8/35125.htm. MySQL是最受欢迎的开源SQL数据库管理系统,它由MySQL AB开发.发布和支持.MySQL AB是一家基于MySQL开发人员的商业公司,它是一家使用了一种成功的商业模式来结合开源价值和方法论的第二代开源公司.MySQL是MySQL AB的注册商标. MySQL是一个快速的.多线程.多用户和健壮的SQL数据库服务器.M

docker-compose + spring boot + mysql + redis + nginx 发布web应用: part 1

-----**  原创 **------ docker的使用现在越来越多,但多个容器的话,还要一个个的安装,比较麻烦.相比于k8s的“厚重”,docker-compose相对要简单得多.这里是一篇使用docker-compose,对spring boot应用进行一个集群(2个docker)发布的过程. 1. 前言    架构:spring boot使用nginx作为反向代理,redis作为缓存,mysql作为数据库,全部docker化.  环境:开发使用win 10笔记本, eclipse id

Ubuntu 安装mysql和简单操作

ubuntu上安装mysql非常简单只需要几条命令就可以完成. 1. sudo apt-get install mysql-server 2. apt-get isntall mysql-client 3.  sudo apt-get install libmysqlclient-dev 安装过程中会提示设置密码什么的,注意设置了不要忘了,安装完成之后可以使用如下命令来检查是否安装成功: sudo netstat -tap | grep mysql 通过上述命令检查之后,如果看到有mysql 的

事务ACID特性

所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位.例如,银行转帐工作:从一个帐号扣款并使另一个帐号增款,这两个操作要么都执行,要么都不执行. 数据库事务必须具备ACID特性,ACID是Atomic(原子性).Consistency(一致性).Isolation(隔离性)和Durability(持久性)的英文缩写. 原子性:指整个数据库事务是不可分割的工作单位.只有使据库中所有的操作执行成功,才算整个事务成功:事务中任何一个SQL语句执行失败,那么已经执行成