草庐IT

mongodb - Mongodb写的原子性

coder 2023-11-04 原文

Mongo 文档说单个文档写入是原子的,但在另一个地方它提到交错事务可能会在写入线程返回之前读取未提交的数据。

我了解其他事务可以读取未提交的数据,因为写入可能尚未提交到日志。

但是在writer线程还没有返回的时候线程如何读取数据呢。是否适用于写关注不是默认的情况?

谢谢 安库尔

最佳答案

有了引用,我现在可以了解上下文并告诉您这是关于什么的。

Mongo documentation says single document write are atomic

是的

it mentions interleaved transactions may read uncommitted

事实上,任何读取都可能获得未提交的数据。这是因为 MongoDB 会在写入磁盘之前先写入 fsync 队列。

MongoDB 可以在进入磁盘之前从这个 fsync 队列中读取,并引用页面:

Other database systems refer to these isolation semantics as read uncommitted.

主要是 ACID 数据库。

But how can threads read data while the writer thread has not returned.

感谢 MongoDBs 并发规则:http://docs.mongodb.org/manual/faq/concurrency/#does-a-read-or-write-operation-ever-yield-the-lock

简而言之,总结一下:写入在其运行期间不会获取独占锁,相反它可以平息(由于各种规则)读取允许您在写入中途返回数据。

这也是为什么您有时必须小心多文档更新和应用程序读取数据的其他线程,它实际上可能获得一半是最新的数据而另一半不是。

关于mongodb - Mongodb写的原子性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24829515/

有关mongodb - Mongodb写的原子性的更多相关文章

  1. HarmonyOS原子化服务开发相关术语 - 2

    术语中文解释Ability原子化服务帮助用户完成任务的原子化服务,和用户的意图进行关联。Fulfillment服务履行通过图标,卡片,语音等形式呈现用户意图。开发者通过接口的方式,处理用户意图,返回内容。Intent意图用于表达用户想要达成的目标或完成的任务。HUAWEIAssistant智能助手“无微不智”的个人助手,通过不断的学习用户的使用习惯,不断的为用户提供贴心的精准的便捷的个性化服务。AISearch全局搜索用户可快速搜索关键词,与之匹配的原子化服务则会出现在搜索结果中。SmartService智慧服务用户订阅原子化服务,在到达特定触发条件(时间、地点、事件)后,卡片推送至用户智能助

  2. ruby - 写一个原子操作 - 2

    根据http://en.wikipedia.org/wiki/Atomicity_(database_systems),我想用Ruby执行一些方法原子性例如,如果我有:a=30b=75我希望能够做这样的事情:atomic_operationdoa+=10b-=39endRuby1.9中是否有允许此类过程的native模块?如果可能的话,我想在不使用插件的情况下这样做。非常感谢! 最佳答案 这实际上取决于您对适合该工作的工具感兴趣的范围。如果您希望对数据库执行原子操作,那么数据库驱动程序可能(如果它有任何好处/数据库支持它)提供一种使

  3. ruby-on-rails - 在一个 Rails 应用程序中使用 PostgreSQL 的 MongoDB - 2

    我可以在一个Rails应用程序中同时使用MongoDB和PostgreSQL吗?具体来说,我最终会想要使用像MongoHQ这样的东西。到目前为止,我未能在实验中进行这项工作。令我担心的是,MongoDB文档特别指出我必须禁用ActiveRecord。任何建议将不胜感激。 最佳答案 您无需禁用ActiveRecord即可使用MongoDB。查看Mongoid只需将gem加上任何模型与您现有的任何ActiveRecord模型一起添加。您应该注意到MongoHQ只是MongoDB的托管服务,可以与任何对象文档映射器(ODM)一起使用。更多

  4. ruby - 使用 mongodb/mongoid 运行时更改模型 - 2

    我必须在mongoid模型中添加几个字段,我知道MongoDB没有迁移,但如果我继续而不删除数据库,使rails完全“重新生成”数据库,它不会显示或使用新的领域!去这里最好的方法是什么?有比删除/重新打开mongodb更软的东西吗?提前致谢卢卡 最佳答案 一般来说,应该可以在运行时用新字段更新旧文档。MongoDB中不需要迁移。您可能想编写rake任务以使用新字段和默认值更新旧文档。您可以通过检查那些默认值为nil的新字段来找到这些文档。更新简单风格:如果您使用默认值定义一个新字段,只要您设置了一个新值,就应该始终使用该值:应用程序

  5. ruby-on-rails - 我如何从 Ruby 代码连接到 mongodb? - 2

    我如何从Ruby代码连接到mongodb? 最佳答案 首先,您必须安装MongoDbgem:geminstallmongo然后运行代码:require'rubygems'#notnecessaryforRuby1.9require'mongo'db=Mongo::Connection.new.db("mydb")#ORdb=Mongo::Connection.new("localhost").db("mydb")#ORdb=Mongo::Connection.new("localhost",27017).db("mydb")

  6. ruby - MongoDB:无法从 BSON 类型 EOO 转换为 Date - 2

    我正在尝试使用聚合框架(使用ruby​​)并像这样投影日期:db['requests'].aggregate([{"$project"=>{_id:0,method:'$method',user:'$user',year:{'$year'=>'$timestamp'}}}])文档是这样的:{_id:ObjectId("5177d7d7df26358289da7dfd"),timestamp:ISODate("2013-04-12T03:58:05+00:00"),method:"POST",status:"200",inputsize:"874",outputsize:"4981",u

  7. ruby - 在 Ruby 中从 MongoDB 中检索字段的子集 - 2

    我试图通过在Ruby中进行的查询从MongoDB获取字段的子集,但它似乎不起作用。它不返回任何结果这是ruby代码:coll.find("title"=>'Halo',:fields=>["title","isrc"])#thisdoesn'twork如果我删除字段散列,它会工作,返回包含所有字段的结果coll.find("title"=>'Halo')#thisworks查看mongodb控制台,第一个查询在mongodb服务器上结束,如下所示:{title:"Halo",fields:["title","isrc"]}如果我尝试从mongo客户端控制台进行查询,它会工作,我会得到结

  8. ruby - 为什么 Ruby 中对数组的 << 操作不是原子的? - 2

    在Ruby中,如果array,则此代码不是线程安全的被多个线程修改:array=[]array为什么是操作不是线程安全的? 最佳答案 实际上使用MRI(Matz的Ruby实现)GIL(全局解释器锁)使任何纯C函数成为原子。自Array#在MRI中作为纯C代码实现,此操作将是原子的。但请注意,这仅适用于MRI。在JRuby上,情况并非如此。为了完全理解发生了什么,我建议您阅读这两篇文章,它们很好地解释了一切:NobodyUnderstandstheGILNobodyUnderstandstheGIL-part2

  9. ruby - Ruby 有原子变量吗? - 2

    Ruby是否有原子变量,如Java中的AtomicInteger或AtomicBoolean? 最佳答案 Hereisagem可能会提供您所需要的(找到linkedfromhere)。Thecodeiscleanandcompactenoughtoquicklyunderstand(它基本上是一个Mutex,正如其他人所建议的那样),如果您想编写自己的Mutex包装器,这应该是一个很好的起点。来自github的轻微修改示例:require'atomic'my_atomic=Atomic.new('')#setmethod1:my_a

  10. ruby - 为什么 Haskell 没有符号(像 ruby​​)/原子(像 erlang)? - 2

    我使用符号的两种语言是Ruby和Erlang,我总是发现它们非常有用。Haskell确实有代数数据类型,但我仍然认为符号会非常方便。立即想到的一个用途是,由于符号与整数同构,您可以在使用整数或字符串“主键”的地方使用它们。原子的语法糖可以是次要的-:something或是一个原子。所有原子都是一个名为Atom的类型的实例,它派生出Show和Eq。然后,您可以将其用于更具描述性的错误代码,例如typeErrorCode=AtomtypeMessage=StringdataError=ErrorErrorCodeMessageloginError=Error:redirect"Please

随机推荐