Mongodb 隔离写操作不提供“;全有或全无”;原子性

Mongodb 隔离写操作不提供“;全有或全无”;原子性,mongodb,Mongodb,我正在使用Mongodb和$isolate操作符文档进行事务处理,如前所述 隔离写操作不提供“全部或全部” 原子性 在 令人困惑的是,$isolate操作符的全部目的是什么。有人能解释一下吗。提前谢谢。$isolated影响隔离,而不是原子性。也就是说,一旦“隔离”操作修改了第一个文档,就会建立一个锁。从那一刻起,直到操作完成并释放锁,客户端不会看到任何其他修改,其他写入操作也不会影响受影响的文档 例如,假设一个集合虚拟对象有3个文档:{a:1}、{a:3}、{a:5}、{a:6},并且在a上有

我正在使用Mongodb和$isolate操作符文档进行事务处理,如前所述

隔离写操作不提供“全部或全部” 原子性


令人困惑的是,$isolate操作符的全部目的是什么。有人能解释一下吗。提前谢谢。

$isolated
影响隔离,而不是原子性。也就是说,一旦“隔离”操作修改了第一个文档,就会建立一个锁。从那一刻起,直到操作完成并释放锁,客户端不会看到任何其他修改,其他写入操作也不会影响受影响的文档

例如,假设一个集合虚拟对象有3个文档:
{a:1}、{a:3}、{a:5}、{a:6}
,并且在
a
上有唯一索引:

db.dummy.createIndex({a:1},{unique:true})
以及以下更新:

db.dummy.update(
    { $isolated : 1 },
    { $inc : { a : 1 } },
    { multi: true }
)
产生:

 db.dummy.find({},{_id:0})
{ "a" : 2 }  // 2 --> was 1
{ "a" : 4 }  // 4 --> was 3
{ "a" : 5 }  // 5 --> not changed; produced a duplicated key error
{ "a" : 6 }  // 6 --> not changed; operation aborted before reaching this document
尝试递增5时,操作已中断,因为它导致了重复的密钥错误,并且5和6均未受到影响。这里没有原子性,因为
a:2、a:4
中的更改没有回滚

隔离所确保的是,没有客户端可以看到处于此中间状态的集合:

 db.dummy.find({},{_id:0})
{ "a" : 2 }  // 1 --> 2
{ "a" : 3 }  // 3 --> still not modified
{ "a" : 5 }  // 5 --> still not modified
{ "a" : 6 }  // 6 --> still not modified
也就是说,其他客户端无法看到“中间”操作;一旦开始,他们将在最后一起看到所有更改


这里一个非常令人困惑的地方是,在2.2版之前,
$isolated
被称为
$atomic
,这确实令人困惑,但现在
$atomic
被弃用,并被更合适的名称
$isolated

所取代。非常感谢