用户是否可以同时获得相同的唯一生成ID?

时间:2015-08-13 08:23:46

标签: java mysql

我制作了一个简单的java程序,可以使用日期作为前缀生成ID,增量号码作为后缀,如150801,其中15是年份,08是月份,{{ 1}}是一个增量数。由于每个用户都将数据保存在数据库中并获得一个唯一生成的ID,如果两个或多个用户同时保存数据,用户是否可以获得相同的生成ID?

6 个答案:

答案 0 :(得分:3)

您的问题的一个简单解决方法是让您的数据库使用自动增量列跟踪您的唯一标识符。

按以下方式创建表格:

CREATE TABLE your_table (
     id BIGINT NOT NULL AUTO_INCREMENT,
     username CHAR(30) NOT NULL,
     ... other fields go here ...
     PRIMARY KEY (id)
)

答案 1 :(得分:2)

您可以使用Java的UUID类将UUID值创建为唯一标识符。如果需要,您将能够从生成的UUID中获取时间戳。

UUID.randomUUID().toString()

如果需要,您可以在稍后的时间段从此字符串中获取时间戳。 How do I extract a date from a UUID using Java?

答案 2 :(得分:1)

首先,处理增量编号的代码应该是线程安全的,否则多个用户可以拥有相同的后缀。

另外,考虑到这种形式的标识符,这意味着每个月只有99个唯一增量编号,即每月99个唯一标识符。这可能足以满足您的要求,但不太可能。

您应该考虑使用UUID类生成标识符。

答案 3 :(得分:0)

如果您的应用程序是多线程的,则回答为是。在数据库中为ID设置唯一约束,并且不会插入具有相同ID的两个用户。但是我会推荐另一个ID生成器,它会生成比你的ID更多的唯一ID。

答案 4 :(得分:0)

您需要某种锁定机制来防止同时用户获得相同的ID。

有几种方法可以实现这一目标:

  1. 使ID列唯一,如果遇到约束违规,则使用新号码重试。
  2. 使用数据库提供的数字生成器(Oracle序列,MS SQL Server的AUTOINCREMENT等)。
  3. 创建一个保存序列值的表,并在读取时锁定该值(使用SELECT xxx FOR UPDATE ...)。

答案 5 :(得分:0)

我已经使MySQL触发器以我需要的格式生成唯一ID。

CREATE TABLE mytable(
   id VARCHAR(7) NOT NULL PRIMARY KEY DEFAULT '0',
   name VARCHAR(20)
);

这是触发器脚本:

DELIMITER $$
CREATE TRIGGER table1_trigger
BEFORE INSERT ON table1
FOR EACH ROW
BEGIN
DECLARE postfix INT(4) ZEROFILL;
DECLARE newID varchar(10);

SET @prefix = DATE_FORMAT(CURDATE(),'%y%m');
SET @wlike = CONCAT(@prefix, '%');
SET @previous_id = (SELECT id FROM table1 WHERE id LIKE @wlike ORDER BY id DESC LIMIT 1);
SET postfix = CAST(SUBSTRING(@previous_id, 5, 8) AS SIGNED);

IF postfix != 9999 THEN
  SET postfix = postfix + 1;
END IF;

SET NEW.id = CONCAT(@prefix, postfix);
END$$
DELIMITER;