0

在我的NodeJs應用程序中,我使用一個線程(由我自己定義)在計算機中打開端口。有一個限制,只有一個線程應該綁定到每個端口。如何針對可能的重複條目優化Mysql INSERT操作?

我在Mysql中維護一個表(PORTS),它包含有關打開端口和綁定線程的數據。目前我正在使用以下方法來避免兩個線程綁定到同一個端口。

=>將一個條目插入帶有端口號的PORTS表中作爲PRIMARY KEY。這將引發以下錯誤

error inserting semaphore port:10014 error Error: ER_DUP_ENTRY: Duplicate entry 'port:10014' for key 'NAME' 

我抓住這個錯誤,然後嘗試另一個端口,直到沒有引發錯誤。

這是一個很好的做法嗎?或者我應該首先檢查值是否存在使用SELECT查詢,然後插入條目,如果不是? 注意AFAIK在第二種方法中,可以使用SQL事務將SELECT和INSERT作爲原子操作運行。

+0

目前的方法對我來說似乎很好。 – Strawberry

回答

0

假設你有多個'客戶端'試圖同時獲得'端口',你的第二種方法是不好的。這是因爲不同的客戶可能會潛入SELECTINSERT之間,並抓住端口。

你的第一種方法更好,因爲它是'原子'。這是一個單一的行動,因此速度更快(不是說速度是大不了的)。

+0

我忘了提及。通過第二種方法,我通過使用SQL事務以原子方式執行兩個操作。我只關心那種情況下的表現。我對嗎? –

+0

的確,這是關於表現。由於有很多可能的端口,錯誤(以及從中恢復)應該很少。 –