MongoDB CRUD 概念 > 读隔离、一致性和时近性


  • Lv 1

    1.隔离的确保性

    • 读取的无限制性

      在MongoDB中客户端可以在写入操作durable之前看到的写入的结果:

      1. 不管 write concern 如何,其它客户端使用 “local”(默认)readConcern可以看到发布给客户端之前的写入操作的结果。

      2. 客户端使用 “local”(默认的)readConcern可以读取到可能在接下来被 rolled back 的数据。

      读取未提交是内定的隔离级别,适用于mongod独立实例以及副本和分片集群。

    • 读取的无限制性与单个文档的原子性

      写入操作对于单个文档是具有原子性的,这就是说如果一个写入操作正在更新一个文档中的多个字段,另一个读取者将不会看到只有部分被更新的字段。
      对于一个单节点 mongod实例,单个文档的读取和写入操作是有顺序的。对于复制集只有在缺少回滚的情况下才会对单个文档的一系列操作具有顺序性。
      尽管读取者不可能看到部分更新的文档,但是读的无限制性意味着并发的读取者还是可以在更新durable之前看到已经更新的文档。

    • 读的无限制性与多个文档写入

      当单个写入操作更改多个文档时,更改每个文档是具有原子性的,但是整个操作是没有原子性的而且其他操作可能会参杂其中。但是您可以使用$isolated隔离单个写入操作更改多个文档。

      如果不隔离多个文档的写操作,MongoDB将展现以下行为:

      1. “无时间点”的读操作。假设一个读操作在时间t1开始读取文档。接下来一个时间t2写操作更新了这个文档。这个读操作可能看到的文档是已经更新后的版本,因此没有“时间点”的快照数据可以读取。

      2. “无序性”操作。假设在时间t1,一个读取操作读取文档d1,并且紧接着在t3的时候,一个写入操作更新d1。这里引入了一个读写依赖,如果操作是有顺序的,读操作一定是在写操作之前。但是假设在时间t2写入操作更新了文档d2,并且紧接着在时间t4读取操作读取了d2。这里又引入了写读依赖,这将使读取操作要在写入操作之后按照顺序执行。这样的一个循环依赖将导致整个顺序化无法实现。

      3. 读取操作的这个特性可能会错误匹配到已经更新的文档。

      使用$isolated操作,一个写入操作将影响多个文档,并能够保证在第一个文档写入操作开始前,其他进程不会参杂在其中。这将保证不会有客户端在写入操作完成或者更新失败跳出之前看到更新。

      $isolated在sharded clusters不起作用

      一个隔离的写入操作不提供”全有或全无”的原子性。这就是说在写入的过程中如果有错误产生,在错误产生之前的更新将不会回滚。

      注解:
      $isolated操作将使写入操作在集合上获得一个排他锁,甚至对于文档级别的锁存储引擎也是这样处理的,比如WiredTiger。这也就是说在执行$isolated操作运行期间会导致WiredTiger单线程运行。

      参见:

      本帖下載内容已隐藏,请登入以查看隐藏内容!


登录后回复
 

与 萌阔论坛 的连接断开,我们正在尝试重连,请耐心等待