我通過使用MongoDB的和$分離操作文檔中交易走,它被提及是什麼意思一個孤立的寫操作不提供「全有或全無」的原子
分離的寫操作呢不能提供「全有或全無」的 原子
在https://docs.mongodb.com/manual/core/write-operations-atomicity/
這是混亂的,那麼究竟是什麼$整個目的隔離操作。有人可以請解釋。感謝提前。
我通過使用MongoDB的和$分離操作文檔中交易走,它被提及是什麼意思一個孤立的寫操作不提供「全有或全無」的原子
分離的寫操作呢不能提供「全有或全無」的 原子
在https://docs.mongodb.com/manual/core/write-operations-atomicity/
這是混亂的,那麼究竟是什麼$整個目的隔離操作。有人可以請解釋。感謝提前。
$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
Awesome.Thanks很多 – codewarrior
你是歡迎,我希望這有助於 – RafaelCaballero