在我的NodeJs应用程序中,我使用线程(由我自己定义)来打开计算机中的端口。有一个限制,即每个端口只能绑定一个线程。
我在Mysql中维护一个表(PORTS),它保存有关开放端口和绑定线程的数据。目前我使用以下方法来避免两个线程绑定到同一个端口。
=>在端口号为PRIMARY KEY的PORTS表中插入一个条目。这将引发以下错误
error inserting semaphore port:10014 error Error: ER_DUP_ENTRY: Duplicate entry 'port:10014' for key 'NAME'
我捕获此错误然后尝试另一个端口,直到没有抛出错误。
这是一个好习惯吗?或者我应该先使用SELECT查询检查值是否存在,然后再检查INSERT条目? 注 - AFAIK在第二种方法中,SELECT和INSERT可以通过使用SQL事务作为原子操作运行。
答案 0 :(得分:0)
假设你有多个'客户'试图同时获得'端口',你的第二种方法是不好的。这是因为不同的客户可以在SELECT
和INSERT
之间潜入并抓住端口。
你的第一种方法更好,因为它是“原子的”。这是一个单一的动作,因此更快(不是速度是一个大问题)。