mysql - mysql触发器是原子的吗?这个mysql触发器有并发问题吗?

标签 mysql sql database concurrency triggers

我创建了以下触发器来使用唯一的整数值填充字段。

我在 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

最佳答案

随机数生成器的一个可能的替代方案是创建 customer_ids具有 auto_increment 主键的表 - 在表中创建一个新行,为 users 创建唯一的 customer_id表

关于mysql - mysql触发器是原子的吗?这个mysql触发器有并发问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26189604/

相关文章:

mysql - 如何匹配值为零或一及更大的记录

mysql - Laravel SQL 查询生成器

sql - 甲骨文 : SUM Column of only duplicates value of other column

database - 健忘症患者的 "first"功能语言? (我真的很喜欢 Clojure...)

mysql - 电子商务网站的数据库结构

mysql - 尝试在 ejabberd (17.07) 上的 android 设备上使用 smack api(4.2) 注册用户时出现错误

sql - 如何填补 MySQL 中的日期空白?

sql - 最近邻居的 Postgis SQL

mysql - 非唯一索引基数

php - 值未保存在数据库中