【資料庫寶典 - MongoDB】併發進行Upsert造成重複資料。

更新 發佈閱讀 3 分鐘

通常我們如果希望一筆資料是能夠具備唯一性的狀況下, 勢必在新增前會進行檢查, 但是在我們的應用程式中, 先查詢再寫入勢必會造成一些時間差, 導致於多人同時操作時, 可能發生重複資料的狀況。

假設我們的應用是不允許名稱重複, 那我們的資料可能如下:

[
{
"name": "john",
"phone": "0911111111"
},
{
"name": "mark",
"phone": "0922222222"
}
]

我們的業務邏輯為「當名稱存在時就更新、不存在就新增」,此時我們可能會分成兩個動作來操作:

  1. 查詢 name = xxx。
  2. 存在: Update、不存在: Insert。

上述狀況在同一時間內只有一個操作都不會發生問題, 但假設同一個時間點有兩個人同時操作時, 就可能發生以下狀況:

vocus|新世代的創作平台

而為了解決上述問題, 我們可以把「查詢/新增/更新」這個動作視為一個單元, 提交給DB去幫我們操作, 也就是透過Upsert的指令來幫我們完成。

但實測後發現在高併發的狀況下, 雖然重複資料的狀況減少了, 但仍然會發生, 若要完全避免這樣的況狀發生, 根據官方的描述:

「To avoid multiple upserts, ensure that the filter field(s) are uniquely indexed. 」(https://docs.mongodb.com/manual/reference/method/db.collection.updateOne/)

要解決這個問題, 我們可以透過「唯一索引」的方式來建立, 以上面的例子來說, 我們的name,就是這個文檔的唯一性關鍵, 因此我們可以對name進行建立Unique索引:

db.collection.createIndex( { "name": 1 }, { unique: true } )

會解決以下兩個問題:

  1. 只要欲更新/新增的name會有重複的狀況發生時, 就會被DB Reject。
  2. 併發的狀況下, 假設同時有兩個一模一樣的upsert在同時間操作, 如下:
db.collection.update(
{
"name": "Ada"
},
{
"$set": {
"name": "Ada", "phone": "0933333333"
}
}
)db.collection.update(
{
"name": "Ada"
},
{
"$set": {
"name": "Ada", "phone": "0933333333"
}
}
)
留言
avatar-img
阿Han的沙龍
167會員
332內容數
哈囉,我是阿Han,是一位 👩‍💻 軟體研發工程師,喜歡閱讀、學習、撰寫文章及教學,擅長以圖代文,化繁為簡,除了幫助自己釐清思路之外,也希望藉由圖解的方式幫助大家共同學習,甚至手把手帶您設計出高品質的軟體產品。
阿Han的沙龍的其他內容
2023/08/08
我們在「【資料庫寶典】什麼是NoSQL?能吃嗎?」有談到一些NoSQL的特性,雖然本質上有所差異,但兩方技術發展的產品也都開始互相支援了,比如說MongoDB後來也發展出類SQL語法讓熟悉SQL的開發者可以降低進入門檻,而SQL、postgresql…等也紛紛納入一些NoSQL的元素,雙方都有開始接
Thumbnail
2023/08/08
我們在「【資料庫寶典】什麼是NoSQL?能吃嗎?」有談到一些NoSQL的特性,雖然本質上有所差異,但兩方技術發展的產品也都開始互相支援了,比如說MongoDB後來也發展出類SQL語法讓熟悉SQL的開發者可以降低進入門檻,而SQL、postgresql…等也紛紛納入一些NoSQL的元素,雙方都有開始接
Thumbnail
2023/05/02
範例句: 假設我們有一段文章以空白隔開的方式來切割詞彙,內容如下: 假設條件為: clauses:[提升,滿意度,問卷] 。 slop:4。 in_order: true ❗ 這裡的Slop代表範圍內不匹配的最大數量,從開始匹配的字詞框到最後加總一併進行計算。 查詢結構會是如此 請問上述條件是否能正
Thumbnail
2023/05/02
範例句: 假設我們有一段文章以空白隔開的方式來切割詞彙,內容如下: 假設條件為: clauses:[提升,滿意度,問卷] 。 slop:4。 in_order: true ❗ 這裡的Slop代表範圍內不匹配的最大數量,從開始匹配的字詞框到最後加總一併進行計算。 查詢結構會是如此 請問上述條件是否能正
Thumbnail
2023/05/01
不論我們使用Nodejs的Mongo Client還是Go語言甚至其他語言的套件, 應該都會看到連線選項中有poolSize這類的配置, 以下會介紹什麼是連線池、優點、應注意的事項。 首先來談談連接池之前的單一連接機制, 在配置正確的狀況下可能不會遇到任何問題, 但假設我們的應用同時間有100個用戶
Thumbnail
2023/05/01
不論我們使用Nodejs的Mongo Client還是Go語言甚至其他語言的套件, 應該都會看到連線選項中有poolSize這類的配置, 以下會介紹什麼是連線池、優點、應注意的事項。 首先來談談連接池之前的單一連接機制, 在配置正確的狀況下可能不會遇到任何問題, 但假設我們的應用同時間有100個用戶
Thumbnail
看更多
你可能也想看
Thumbnail
資料庫複制、身份驗證都有了,還能做什麼讓我們的資料更加安全呢?喔對了,還可以備份我們的資料!接下來來講匯出整個資料庫的資料來做備份 安裝 MongoDB Database Tools MongoDB 這邊有一個指令叫 mongodump 是用來匯出資料庫的資料,你可以匯出整個資料庫,也可以選擇匯出部
Thumbnail
資料庫複制、身份驗證都有了,還能做什麼讓我們的資料更加安全呢?喔對了,還可以備份我們的資料!接下來來講匯出整個資料庫的資料來做備份 安裝 MongoDB Database Tools MongoDB 這邊有一個指令叫 mongodump 是用來匯出資料庫的資料,你可以匯出整個資料庫,也可以選擇匯出部
Thumbnail
《轉轉生》(Re:INCARNATION)為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,結合拉各斯街頭節奏、Afrobeat/Afrobeats、以及約魯巴宇宙觀的非線性時間,建構出關於輪迴的「誕生—死亡—重生」儀式結構。本文將從約魯巴哲學概念出發,解析其去殖民的身體政治。
Thumbnail
《轉轉生》(Re:INCARNATION)為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,結合拉各斯街頭節奏、Afrobeat/Afrobeats、以及約魯巴宇宙觀的非線性時間,建構出關於輪迴的「誕生—死亡—重生」儀式結構。本文將從約魯巴哲學概念出發,解析其去殖民的身體政治。
Thumbnail
主要是收攏documents的容器, 可以支援各種不同結構的document。 不能為空字串。 不能以system開頭, 這是系統集合保留的前綴。 超過配置大小, 新增時當超過配置限額時, 會先從最早的document刪除後再append新的document。 更新時不能超過size限制。 不能刪除
Thumbnail
主要是收攏documents的容器, 可以支援各種不同結構的document。 不能為空字串。 不能以system開頭, 這是系統集合保留的前綴。 超過配置大小, 新增時當超過配置限額時, 會先從最早的document刪除後再append新的document。 更新時不能超過size限制。 不能刪除
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
我們在「【資料庫寶典】什麼是NoSQL?能吃嗎?」有談到一些NoSQL的特性,雖然本質上有所差異,但兩方技術發展的產品也都開始互相支援了,比如說MongoDB後來也發展出類SQL語法讓熟悉SQL的開發者可以降低進入門檻,而SQL、postgresql…等也紛紛納入一些NoSQL的元素,雙方都有開始接
Thumbnail
我們在「【資料庫寶典】什麼是NoSQL?能吃嗎?」有談到一些NoSQL的特性,雖然本質上有所差異,但兩方技術發展的產品也都開始互相支援了,比如說MongoDB後來也發展出類SQL語法讓熟悉SQL的開發者可以降低進入門檻,而SQL、postgresql…等也紛紛納入一些NoSQL的元素,雙方都有開始接
Thumbnail
資料庫複製 不知道大家有沒有聽過負載均衡或者水平擴展呢?在網站佈署中我們會透過這些技術把網站架在多台 server 上,以避免萬一某台 server 掛掉,讓網頁服務仍能維持運作,或者去分擔負載 MongoDB 這邊有一個叫資料庫複製的技術,建立多個相同的 MongoDB service 在不同的
Thumbnail
資料庫複製 不知道大家有沒有聽過負載均衡或者水平擴展呢?在網站佈署中我們會透過這些技術把網站架在多台 server 上,以避免萬一某台 server 掛掉,讓網頁服務仍能維持運作,或者去分擔負載 MongoDB 這邊有一個叫資料庫複製的技術,建立多個相同的 MongoDB service 在不同的
Thumbnail
不論我們使用Nodejs的Mongo Client還是Go語言甚至其他語言的套件, 應該都會看到連線選項中有poolSize這類的配置, 以下會介紹什麼是連線池、優點、應注意的事項。 首先來談談連接池之前的單一連接機制, 在配置正確的狀況下可能不會遇到任何問題, 但假設我們的應用同時間有100個用戶
Thumbnail
不論我們使用Nodejs的Mongo Client還是Go語言甚至其他語言的套件, 應該都會看到連線選項中有poolSize這類的配置, 以下會介紹什麼是連線池、優點、應注意的事項。 首先來談談連接池之前的單一連接機制, 在配置正確的狀況下可能不會遇到任何問題, 但假設我們的應用同時間有100個用戶
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
假設資料如下: local DB裡面的test Collection SELECT SELECT可以這樣寫: 由於config/database.php中設定的default DB_CONNECTION是mysql,所以這邊特別指定使用mongodb connection。 回傳結果如下: 軟刪除
Thumbnail
假設資料如下: local DB裡面的test Collection SELECT SELECT可以這樣寫: 由於config/database.php中設定的default DB_CONNECTION是mysql,所以這邊特別指定使用mongodb connection。 回傳結果如下: 軟刪除
Thumbnail
Connect database 因爲我們後端是用 django,所以我們要用 python 來操作 MongoDB,MongoDB 官方推薦的 python driver 是 pymongo,首先來安裝 在想使用的檔案內加入 myclient = pymongo.MongoClient("mong
Thumbnail
Connect database 因爲我們後端是用 django,所以我們要用 python 來操作 MongoDB,MongoDB 官方推薦的 python driver 是 pymongo,首先來安裝 在想使用的檔案內加入 myclient = pymongo.MongoClient("mong
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
MongoDB 簡介 MongoDB是一種開源的NoSQL文件資料庫(Document Database),MongoDB中可以有多個Database,每個Database中可以有多個Collection,每個Collection中可以有多個Document。 Windows 安裝 MongoDB
Thumbnail
MongoDB 簡介 MongoDB是一種開源的NoSQL文件資料庫(Document Database),MongoDB中可以有多個Database,每個Database中可以有多個Collection,每個Collection中可以有多個Document。 Windows 安裝 MongoDB
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News