2017-11-25 183 views
1

您好我有一個節點js代碼,它使用findOneAndUpdate和Upsert = true創建一個新的mongodb文檔(如果不存在)。測試findOneAndUpdate upsert重複阻止

我想測試兩個異步線程是否同時調用我的代碼,然後它會創建重複項。

這甚至可以測試嗎?我怎樣才能做到這一點。我是一名初學者測試。

回答

0

文檔級併發

WiredTiger用來寫 操作文檔級的併發控制。因此,多個客戶端可以同時修改集合的不同 文檔。

對於大多數讀寫操作,WiredTiger使用樂觀的 併發控制。 WiredTiger僅在全球數據庫和收集級別使用意向鎖。當存儲引擎檢測到兩個操作之間的衝突時,將會發生寫衝突 ,導致MongoDB透明地重試該操作。

一些全局操作(通常涉及多個數據庫的短期操作)仍需要全局「實例範圍」鎖定。某些其他操作(如刪除集合)仍需要專有數據庫鎖定。

Document Level Concurrency

,並在單個集合相同_id永遠不會存在_id上有一個唯一索引,所以即使你解釋的情況發生,這將得到執行將創建一個新的第一查詢文檔和稍後的查詢將更新它。

+0

重複我的意思是兩個文件被創建與單獨的id和但相同的數據值。 https://docs.mongodb.com/manual/reference/method/db.collection.findAndModify/查看Upsert和唯一索引的鏈接段落。 –

+0

好吧,我以爲你只是通過匹配_id進行更新。就你而言,如果你試圖匹配更新的字段不是唯一索引的,那麼你可能會得到重複的文檔。 – daemon24

+0

是的,我確實讓他們獨一無二,只是想知道我是否可以對它進行測試。 –