我想知道解决这个问题的最佳方法:给出一个电子商务网站预先生成的500个唯一折扣代码列表,我如何确保首批500个收到折扣代码的用户每人都得到一个唯一的折扣码?电子商务站点将向一个单独的服务器发出异步请求,并将折扣代码列表存储在其数据库中。这是这个服务器的工作,确保它只发回每一个折扣代码一次,按时间顺序收到的请求。
由于这似乎是一个相当原始的问题,我想知道是否有一个聪明和优雅的方法来做到这一点,相对较低的努力水平。
发布于 2015-03-20 23:48:36
如果您的DB有原子事务,这是没有问题的。只需使用两个字段( code (varchar宽度足以容纳代码)和used (布尔值)创建一个表used,然后由used和code进行索引。最初,INSERT 500行,当然每个行都带有used = false。每当请求出现时,只要是SELECT min(code) FROM discount FOR UPDATE WHERE NOT used,然后是UPDATE discount SET used = true WHERE NOT used AND code = <that code>,都在单个DB事务中。(更新的NOT used部分对于正确性来说并不是必需的,但是可以通过启用索引来加快速度。)
如果争用是一个问题(我不知道如何处理500个请求,但可能会出现争用),那么向表中添加一个包含1到500之间的唯一整数的整数id字段。然后,在每个请求中,选择一个介于1到500之间的随机数r和SELECT min(code) FROM discount FOR UPDATE WHERE NOT used AND (id >= <r> OR id + 500 >= <r>)。括号中的条件确保搜索将“环绕”到更低编号的折扣,前提是(并且只有当)所有折扣>= r已经被接受。
https://stackoverflow.com/questions/29177386
复制相似问题