从包含数字列表的文件中同时获取唯一编号

时间:2011-10-17 08:44:13

标签: database postgresql concurrency unique file-locking

我在文件中有一个唯一编号列表。每当我的网站的用户发出请求时,我需要从该列表中获取值,这样其他用户就不会获得相同的值。可能存在许多并发请求,因此主要问题是保证没有两个用户获得相同的值。我并不关心性能,因为用户在发出请求后并不期望任何回复,所以一切都可能在后台发生。根据我的阅读,这可以使用文件锁实现,或者我可以在数据库中存储数据并使用数据库锁。我只是想知道做这件事的最佳方法是什么。我使用postresql作为我的数据库,并想知道是否可以使用序列来完成,我将序列中的当前行号存储,以便我的程序知道从db读取哪一行。但同样我不确定如何防止多个进程在其中任何一个有机会更新它之前读取同一行。

1 个答案:

答案 0 :(得分:3)

数据库实际上并没有做很多事情,但是他们做了什么,他们做得很好。特别是,它们处理对数据的并发访问。您可以利用这个优势:

  • 创建表格:create table special_number (id serial, num varchar(100) not null);
  • 确保唯一性:create unique index special_number_num on special_number(num);
  • 使用COPY将您的号码加载到表中,让ID自动从1开始计数
  • 创建序列:create sequence num_seq;
  • 使用postgres的nextval函数保证并发安全的事实,可以安全地从列表中选择一个数字:select num from special_number where id = (select nextval('num_seq'));。如果您的数字用完,这将返回null

这种方法100%安全且容易 - 作为数据库,postgres的内部优势可以解决所有繁重问题。

这是从上面提取的SQL:

create table special_number (id serial, num varchar(100) not null);
create unique index special_number_num on special_number(num);
copy special_number(num) from '/tmp/data.txt'; -- 1 special number per file line
create sequence num_seq;
select num from special_number where id = (select nextval('num_seq'));

此SQL已经在postgres上测试过并按预期工作。