11-【MongoDB入门教程】MongoDB原子性和事务

在MongoDB中,写操作的原子性是在document级别上的,即使修改的是文档中的内嵌部分,写锁的级别也是document上。

当一个写操作要修改多个文档,每个文档的修改是原子性的。整个的写操作并不是原子性的,它可能和其他写操作产生交织。然而你可以使用$isolated隔离操作符来限制写操作,让它不与其他写操作交织。 不隔离性能更高,但是会产生数据的不确定性,隔离写操作,事务性更好。MongoDB把这个级别完全由用户控制。

隔离写操作

MongoDB使用$isolated操作符来隔离写操作。如果一个写操作要更新多个文档,它能防止其他进程与本次写操作交错。直到这个写操作完成,其他进程才能写。

但是,$isolated算不上一个事务,如果在写的过程中发生错误,MongoDB并不会回滚已经写的数据。$isolated也不能在分片集群上工作。

特性:

  • 隔离不支持分片集群
  • 不支持“all-or-nothing”特性
  • MongoDB2.2版本后$isolated被替换成$atomic

类事务语法

MongoDB并不支持关系型数据库中的那种事务特性,为了性能着想,它把这个特性交给程序员去实现。这就是MongoDB官方所讲的Two Phase Commits两阶段提交。这个技术虽然在一定程度上能保证数据最终的一致性,但是应用程序还是可能会读到提交或者回滚过程中的中间数据。对于这个技术如果有兴趣可以读一读原文。

并发控制

并发控制允许多个应用层程序同时访问数据库,而不引起数据不一致或冲突。

MongoDB中提到两种技术来解决这个问题。第一种是唯一索引,第二种是叫Update if Current

用唯一索引来防止多个进程重复插入或者更新导致的重复的值。
Update if Current意思是说在更新数据的时候,在更新条件里给定一个期望的值(这个值是先查询出来的),用来防止在更新之前其他进程已经将此值更新。看一个例子:

var myDocument = db.products.findOne( { sku: "abc123" } );

if ( myDocument ) {
   var oldQuantity = myDocument.quantity;
   var oldReordered = myDocument.reordered;

   var results = db.products.update(
      {
        _id: myDocument._id,
        quantity: oldQuantity,
        reordered: oldReordered
      },
      {
        $inc: { quantity: 50 },
        $set: { reordered: true }
      }
   )

   if ( results.hasWriteError() ) {
      print( "unexpected error updating document: " + tojson(results) );
   }
   else if ( results.nMatched === 0 ) {
      print( "No matching document for " +
             "{ _id: "+ myDocument._id.toString() +
             ", quantity: " + oldQuantity +
             ", reordered: " + oldReordered
             + " } "
      );
   }
}

同样的,在findAndModify()函数中:

db.people.findAndModify({
    query: { name: "Andy" },
    sort: { rating: 1 },
    update: { $inc: { score: 1 } },
    upsert: true
})

如果有多个进程同时调用此函数,这些进程都完成了查询阶段,如果name字段上没有唯一索引,upsert阶段的操作,多个进程可能都会执行。导致写入重复的文档。

时间: 2024-12-26 17:19:54

11-【MongoDB入门教程】MongoDB原子性和事务的相关文章

MongoDb 入门教程

MongoDb 入门教程 目录 MongoDb的基本数据结构 安装MongoDb服务器 连接MongoDb服务器 MongoDb创建数据库 MongoDb创建表 MongoDb插入数据 MongoDb查询数据 范围操作符 AND操作符 OR操作符 排序 聚合 MongoDb更新数据 MongoDb删除数据 常用的DDL命令 MongoDb图形化工具 总结 参考资料 MongoDb 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的. 它是可扩展的高性能数

.NET平台下使用MongoDB入门教程

适合人群:完全没有接触MongoDB或对MongoDB有一点了解的C#开发人员.因为本文是一篇入门级的文章. 一.了解MongoDB  MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案.  MongoDB是一个高性能,开源,无模式的文档型数据库,是当前NoSql数据库中比较热门的一种. MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的.他支持的数据结构非常松散,是类似js

MongoDB入门教程三[数据类型]

MongoDB的文档使用BSON(Binary JSON)来组织数据,BSON类似于JSON,JSON只是一种简单的表示数据的方式,只包含了6种数据类型(null.布尔.数字.字符串.数组及对象),不能完全满足复杂业务的需要,因此,BSON还提供日期.32位数字.64位数字等类型.以下对mongoDB的类型进行简要说明: 1. Null[类型编号:10] null类型用于表示空值或不存在的字段,如:{“x”:null} 2. 布尔类型 Boolean[类型编号:8] 布尔类型有两上值,’true

MongoDB入门教程(一)

MongoDB简介 MongDB是一个高性能,开源,无模式的文档型NosQL数据库. 主要功能特性: 1.文件存储格式BSON(一种json的扩展) 2.模式自由 数据格式不受限了表的结构 3.支持动态查询 4.支持完全索引 5.支持复制(其主从复制)和故障恢复 6.使用高效的二进制数据存储,包括大型对象 7.自动处理碎片,以支持云计算层次的扩展. 8.支持Java.Ruby.Python.C++.PHP等多种语言 9.内部支持Javascript MongoDB的优势 1.查询速度快 2.高并

MongoDB入门教程二[MongoDB Shell 简介与使用]

MongoDB Shell 是MongoDB自带的JavaScript Shell,随MongoDB一同发布,它是MonoDB客户端工具,可以在Shell中使用命令与MongoDB实例交互,对数据库的管理操作(CURD.集群配置.状态查看等)都可以通过MongoDB Shell来完成. 今天介绍MongoDB的一些基本命令和小技巧: 1.利用help查看帮助: 输入:“db.user.find().help();”查看find()的帮助信息 2.基本命令: 连接/切换数据库       例如:u

MongoDB入门教程一[文档与集合]

MongoDB 是面向集合存储的文档型数据库,其涉及到的基本概念与关系型数据库相比有所不同.举个例子,在关系型数据库中,我们记录一个订单的信息,通常是这样设计表结构的: 设计一个订单基本信息表和一个订单明细表,1个订单有N个订单明细,这些订单明细通过外键关联到订单主表,所以要存储一个订单的信息,需要“1+N”条记录.在MongoDB中将订单基本信息和该订单的所有订单明细信息通过嵌套的json格式组织起来,保存为1个文档.也就是说在关系型数据库中需要“1+N”条记录存储的数据,MongoDB保存为

MongoDB入门教程(包含安装、常用命令、相关概念、使用技巧、常见操作等)【转载】

一.安装和配置 MongoDB 的官方下载站是 http://www.mongodb.org/downloads,可以去上面下载最新的安装程序 Windows 平台的安装 ● 步骤一: 下载 MongoDB     点击上方官方下载地址, 并下载 Windows 版本 ● 步骤二: 设置 MongoDB 程序存放目录     下载完成后, 解压到自定义文件夹,例: D:\mongodb\ ● 步骤三: 设置数据文件存放目录     在 D:\mongodb\ 目录下创建 db 和 logs 文件

MongoDB入门教程(二)

上一篇博文中,我详细描述了从MongoDB简介到安装,在本节,主要从整体角度去看MongoDB. MongoDB的数据架构 官方是这样描述的 MongoDB stores all documents in collections. A collection is a group of related documents that have a set of shared common indexes. Collections are analogous to a table in relatio

Mongodb最基础入门教程

Mongodb最基础入门教程 如果想了解一下redis的入门教程,可以去看一下我的上一篇博客 Mongodb的安装大家可以参考一下其他博主的博客,这里我就不做介绍了.不过值得注意的是,在Linux版本中如果启动mongodb的时候出现下面这个错误(在windows版本中不会出现下面的问题): mongod: /usr/lib/libcurl.so.4: version `CURL_OPENSSL_3' not found (required by mongod) 原因是因为mongodb启动需要

MongoDB快速入门教程 (3.2)

3.2.索引 索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,建立索引,通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录,这种扫描全集合的查询效率是非常低的,特别是在数据量特别大的时候,话费的时间就非常的多 举个例子:目前我的一个集合中有170多万条数据,我们在没有建立索引的情况下测试一下查询时间 db.course.find({"name": "mongodb入门8888"})