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