【问题标题】:Are mysql triggers atomic? Does this mysql trigger have concurrency issues?mysql触发器是原子的吗?这个mysql触发器有并发问题吗?
【发布时间】: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


    【解决方案1】:

    随机数生成器的一种可能替代方法是使用 auto_increment 主键创建 customer_ids 表 - 在表中创建一个新行以为 users 表创建唯一的 customer_id

    【讨论】:

    • 您的意思是创建一个从 auto_increment_id 到 random_number 的映射表并预先填充它?
    • @TheSurrican 是的,select id from customer_ids where is_used = 0 order by rand() limit 1 之类的东西应该可以最大限度地减少碰撞次数
    猜你喜欢
    • 2013-12-06
    • 1970-01-01
    • 1970-01-01
    • 2011-03-17
    • 1970-01-01
    • 2010-12-23
    • 2011-02-11
    相关资源
    最近更新 更多