竞争条件可以发生在PHP / PostgreSQL(这是一个在线排队网站)?

ax6ht2ek  于 2022-12-26  发布在  PostgreSQL
关注(0)|答案(2)|浏览(94)

我正在创建一个在线排队站点。首先,用户登录Web应用程序。在他第一次登录时,他将被分配一个队列编号(该编号将用于确定用户在现场活动期间的顺序)。是否会发生竞争条件?预期用户介于600-1000之间。
我不希望在确定用户的队列号时出现任何冲突。我计划通过在数据库中跟踪最后给定的队列号来分配队列号,然后将其递增1并将该编号分配给用户的“Queue_NO."。
其中用户是数据库中的实体。

nhaq1z21

nhaq1z211#

我想最好的方法是创建一个名为event_queue的表,并使用自动增量生成数字。

id
id_event
id_user

当一个新用户登录一个事件时,在事件队列中创建一个新条目,id将是她的队列号

dxxyhpgq

dxxyhpgq2#

冲突确实可能发生,但这没关系。
对于事务数据库,数据修改查询可能会因为冲突而失败。数据库将检测冲突并报告它。(对于example,错误消息为“could not serialize access due to concurrent update“)。通常的做法是检查事务的状态,如果发生冲突,则重复该操作。
类似地,当您向数据库中插入新的队列号时,必须检查事务是否成功,如果不成功,则重复该操作。
您可以像Ali建议的那样创建一个自动增量,但我通常更喜欢更简单的“max + 1”逻辑。
但请注意,自动增量和“max + 1”的行为不同:如果你删除了队列末尾的一些条目(或者如果一些插入事务回滚),“max + 1”方法将重用它们的编号。2自动增量将使这些编号不被使用。
附:举个例子:http://sqlfiddle.com/#!15/06b87/7

CREATE TABLE queue (id INTEGER NOT NULL PRIMARY KEY);
INSERT INTO queue SELECT COALESCE (MAX (id) + 1, 1) FROM queue RETURNING id;

(See也称为postgreSQL function for last inserted ID)。

相关问题