【发布时间】:2013-03-01 10:25:39
【问题描述】:
假设我有几个脚本发送(合法!)电子邮件。每个脚本处理更大列表的一部分,并且它们同时运行。在发送之前,必须检查每个地址以避免两次发送到同一地址。
为此,我创建了一个仅包含电子邮件地址的简单表(mysql 5.1,innodb)。如果它不在表中,则添加它,然后发送邮件。现在我需要避免多个脚本同时测试同一个地址并错误地断定它没有被发送到的竞争条件。我想我可以为此使用锁,但出于性能原因,我宁愿不这样做。
所以我想知道以下替代方案是否正确:
- 在地址列上添加唯一索引
- 只需插入地址,无需选择检查
- trap返回的mysql错误码:如果是1062,则地址已经存在。
在此设置中,是否仍有可能出现竞争条件?我的意思是:是否仍然有可能两个几乎同时插入地址的脚本都得出邮件尚未发送的结论?或者我应该为此使用锁吗?
谢谢, 斯蒂金
【问题讨论】:
-
出于兴趣,为什么不只使用 1 个脚本?
-
这些电子邮件是从哪里来的?如果脚本在实际发送电子邮件之前崩溃,是否会出现问题?是什么让您认为锁无法正常工作? (除此之外,唯一索引是避免欺骗的有效方法。)
-
@F4r-20:启用到 postfix 服务器的多个并发连接。
-
@ÁlvaroG.Vicario:这是一个很大的列表,为了加快发送速度,它被分成了多个较小的列表。脚本不应崩溃。锁可以工作,但似乎有点矫枉过正。