在我的 NodeJs 应用程序中,我使用线程(由我自己定义)来打开计算机中的端口。有一个限制,即每个端口只能绑定(bind)一个线程。
我正在 Mysql 中维护一个表(PORTS),其中保存有关开放端口和绑定(bind)线程的数据。目前我正在使用以下方法来避免两个线程绑定(bind)到同一端口。
=> 将一个条目插入到 PORTS 表中,并将端口号作为主键。这将引发以下错误
error inserting semaphore port:10014 error Error: ER_DUP_ENTRY: Duplicate entry 'port:10014' for key 'NAME'
我捕获此错误,然后尝试另一个端口,直到不再抛出错误。
这是一个好的做法吗?或者我应该首先使用 SELECT 查询检查该值是否存在,如果不存在则插入条目? 注意 - AFAIK 在第二种方法中,SELECT 和 INSERT 可以通过使用 SQL 事务作为原子操作运行。
最佳答案
假设您有多个“客户端”尝试同时获取“端口”,那么您的第二种方法很糟糕。这是因为不同的客户端可能会潜入 SELECT
和 INSERT
之间并抢占端口。
您的第一种方法更好,因为它是“原子”的。而且它是一个单一的 Action ,因此速度更快(并不是说速度有什么大不了的)。
关于mysql - Mysql INSERT 操作如何针对可能的重复条目进行优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40304789/