我正在创建一个在线排队站点。首先,用户登录Web应用程序。在他第一次登录时,他将被分配一个队列编号(该编号将用于确定用户在现场活动期间的顺序)。是否会发生竞争条件?预期用户介于600-1000
之间。
我不希望在确定用户的队列号时出现任何冲突。我计划通过在数据库中跟踪最后给定的队列号来分配队列号,然后将其递增1并将该编号分配给用户的“Queue_NO."。
其中用户是数据库中的实体。
我正在创建一个在线排队站点。首先,用户登录Web应用程序。在他第一次登录时,他将被分配一个队列编号(该编号将用于确定用户在现场活动期间的顺序)。是否会发生竞争条件?预期用户介于600-1000
之间。
我不希望在确定用户的队列号时出现任何冲突。我计划通过在数据库中跟踪最后给定的队列号来分配队列号,然后将其递增1并将该编号分配给用户的“Queue_NO."。
其中用户是数据库中的实体。
2条答案
按热度按时间nhaq1z211#
我想最好的方法是创建一个名为event_queue的表,并使用自动增量生成数字。
当一个新用户登录一个事件时,在事件队列中创建一个新条目,id将是她的队列号
dxxyhpgq2#
冲突确实可能发生,但这没关系。
对于事务数据库,数据修改查询可能会因为冲突而失败。数据库将检测冲突并报告它。(对于example,错误消息为“
could not serialize access due to concurrent update
“)。通常的做法是检查事务的状态,如果发生冲突,则重复该操作。类似地,当您向数据库中插入新的队列号时,必须检查事务是否成功,如果不成功,则重复该操作。
您可以像Ali建议的那样创建一个自动增量,但我通常更喜欢更简单的“max + 1”逻辑。
但请注意,自动增量和“max + 1”的行为不同:如果你删除了队列末尾的一些条目(或者如果一些插入事务回滚),“max + 1”方法将重用它们的编号。2自动增量将使这些编号不被使用。
附:举个例子:http://sqlfiddle.com/#!15/06b87/7
(See也称为postgreSQL function for last inserted ID)。