唯一代码 - 给予在同一秒内点击脚本的两个用户

Unique Codes - Given to two users who hit script in same second

您好,数据库中有一堆唯一代码,只能使用一次。

两个用户点击一个脚本,同时分配给他们并获得相同的代码!

脚本在 Magento 中,用户可以订购多个代码。问题是,如果一位客户订购了 1000 个代码,脚本会从数据库中获取前 1000 个代码并将其放入一个数组中,然后遍历它们,将它们设置为 "Used" 并将它们分配给一个订单。如果第二个用户在相似的时间点击同一个脚本,那么该脚本会在该时间点获取数据库中的前 1000 个代码,因为第一个脚本还没有机会完成分配它们而交叉。

这很不幸,但已经发生过好几次了!

我的想法是创建一个新的 table,一旦用户点击脚本,就会用 "order_id" "code_type" 生成一行。然后在同一个脚本中进行检查,如果一行在这个新的 table 中并且 "code_type" 与用户订购的行相匹配,它将等待 60 秒并再次检查,直到以前的代码是发出并且 table 为空,然后它将创建一行并关闭它。

我不确定这是否是最好的方法,或者如果两个用户在同一秒再次点击是否会插入两行然后关闭我们遇到同样的问题!

非常感谢任何建议!

正确答案取决于您使用的数据库。

例如在 MySQL 中使用 InnoDB 可能的解决方案是使用 SELECT ... LOCK IN SHARE MODE.

的事务

从原理上讲,它通过触发以下查询来实现:

START TRANSACTION;
SELECT * FROM codes WHERE used = 0 LIMIT 1000 LOCK IN SHARE MODE;
// save ids
UPDATE codes SET used=1 WHERE id IN ( ...ids....);
COMMIT;

更多信息请访问 http://dev.mysql.com/doc/refman/5.7/en/innodb-locking-reads.html