【发布时间】:2014-11-29 03:23:08
【问题描述】:
我创建了以下触发器来填充具有唯一整数值的字段。
我在 InnoDB 表中使用它,并且该字段上有一个 UNIQUE 键约束。
是否有可能两个并发插入产生相同的值并且由于唯一约束其中一个失败,或者触发器是“原子的”?
这段代码是否还有其他我可能没有想到的问题?
有没有更好的方法来获得我想要的行为?可能对自动增量值有一些软同构?
CREATE TRIGGER `generate_customer_id` BEFORE INSERT ON `users`
FOR EACH ROW BEGIN
DECLARE i INT;
DECLARE duplicate INT DEFAULT 1;
DECLARE tries INT DEFAULT 0;
WHILE duplicate > 0 DO
SET tries = tries + 1;
IF tries > 100 THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'no customer id found after 100 tries', MYSQL_ERRNO = 1001;
END IF;
SET i = ROUND((RAND() * (999999999-100000000))+100000000);
SET duplicate = (SELECT COUNT(*) FROM users WHERE customer_id = i);
END WHILE;
SET NEW.customer_id = i;
END
【问题讨论】:
标签: mysql sql database concurrency triggers