我正在使用下面显示的触发器自动为插入的行分配随机键,如果找到现有行,则重试随机生成。99.9% 的时间这完全符合预期。然而,每隔几周左右,触发器就会锁定,其中的REPEAT
循环显然会变得无限;查询无限期地继续,有效地锁定了应用程序,并且必须被KILL
编辑。
据我所见,所涉及的逻辑没有任何东西使这似乎应该发生。所涉及的密钥空间肯定不会耗尽,而且永远不会耗尽。到底是怎么回事?
触发:
DELIMITER //;
CREATE TRIGGER `mytable_insert` BEFORE INSERT ON `mytable`
FOR EACH ROW
BEGIN
DECLARE `curr` BIGINT UNSIGNED;
DECLARE `sel` BIGINT UNSIGNED;
IF NEW.`mykey` IS NULL THEN
REPEAT
SELECT FLOOR(RAND() * 18446744073709551615) INTO `sel`;
SELECT `id` INTO `curr` FROM `mytable` WHERE `mykey` = `sel` LIMIT 1;
UNTIL `curr` IS NULL END REPEAT;
SET NEW.`mykey` = `sel`;
END IF;
END