2016-12-27 36 views

回答

1

$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 

也就是說,其他客戶不能看到操作「中間」;一旦開始,他們會在最後看到所有的變化。這裏

一個非常混亂的一點是,$isolated被稱爲$atomic直到2.2版本,這簡直太混亂,但現在$atomic已被棄用,並已替換爲更合適的名稱$isolated

+0

Awesome.Thanks很多 – codewarrior

+0

你是歡迎,我希望這有助於 – RafaelCaballero

相關問題