【问题标题】:Atomicity of write in Mongo dbMongoDB中写入的原子性
【发布时间】:2014-07-18 16:11:16
【问题描述】:

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

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

但是当写线程没有返回时线程如何读取数据。是不是写关注点不是默认的情况?

谢谢 安库尔

【问题讨论】:

标签: mongodb


【解决方案1】:

好的,我现在可以得到一个上下文并告诉你这是关于什么的。

Mongo 文档说单个文档写入是原子的

是的

它提到交错的事务可能读取未提交

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

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

其他数据库系统将这些隔离语义称为未提交读。

主要是 ACID 数据库。

但是当写线程没有返回时,线程如何读取数据。

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

简而言之,总而言之:写入不会在其运行期间采用排他锁,而是可以(由于各种规则)消退到读取,从而允许您在写入过程中返回数据。

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

【讨论】:

  • 谢谢你,Sammaye。但我仍然不是很清楚。我想了解一个只写一个文档的作家线程的上下文。据我了解,写入线程将写入 fsync 队列并返回,所有这些都是原子的,那么读取线程如何在线程返回之前读取该更改?
  • @Ankur 因为它是一个单独的线程,文档中规定的写入线程可以在读取线程的写入过程中消退,因此读取线程实际上可以在写入线程之前返回已经回到原来的线程
  • 谢谢你,Sammaye。我以某种方式将原子性等同于获得不正确的排他锁。所以我的坏。谢谢!!
  • @Ankur 它不像 SQL 那样对整个事务执行每个文档,因此理论上单个文档写入在完成之前不能返回,但多个文档可以
猜你喜欢
  • 2017-11-19
  • 1970-01-01
  • 1970-01-01
  • 2017-12-21
  • 1970-01-01
  • 2016-04-04
  • 2013-05-07
  • 2011-02-03
  • 2011-09-30
相关资源
最近更新 更多