concurrency - 并发MySql自动递增列增加 10个问题

  显示原文与译文双语对照的内容

我是一个服务于我的MySql数据库的主机公司的用户。 由于复制问题,autoincrement值 increses by 10,这似乎是一个常见问题。

我的问题是如何模拟( 安全的) 自动增量功能,以便该列具有连续的that?

为了解决我的问题,我的想法是实现一些序列机制,但我不知道它是否是最好的选择。 我在网上找到了这样的代码 snipset:


DELIMITER ;;



DROP TABLE IF EXISTS `sequence`;;


CREATE TABLE `sequence` (


 `name` CHAR(16) NOT NULL,


 `value` BIGINT UNSIGNED NOT NULL,


 PRIMARY KEY (`name`)


) ENGINE=MyISAM DEFAULT CHARSET=latin1;;



DROP FUNCTION IF EXISTS `nextval`;


CREATE FUNCTION `nextval`(thename CHAR(16) CHARSET latin1)


RETURNS BIGINT UNSIGNED


MODIFIES SQL DATA


SQL SECURITY DEFINER


BEGIN


 INSERT INTO `sequence` 


 SET `name`=thename, 


 `value`=(@val:=@@auto_increment_offset)+@@auto_increment_increment


 ON DUPLICATE KEY 


 UPDATE `value`=(@val:=`value`)+@@auto_increment_increment;


 RETURN @val;


END ;;



DELIMITER ;



看起来完全正确。 我的第二个问题是,如果这个解决方案是并发安全的? 当然,INSERT语句是,但是在重复的键更新上?

谢谢!

时间: 原作者:

你为什么要把它放在第一个地方?

即使使用 auto_increment_increment == 1,也不能保证,表中的自动递增字段将具有连续值( 如果这些行被删除了,嗯) 。

通过db引擎,你可以简单地保证自动增量,这个字段将是唯一的,没有别的。

编辑:我想重复: 在我看来,假设 autoincrement autoincrement的并发值是一个好主意,因为它在以后会 bite 。

EDIT2: 无论如何,这可以通过"插入时"触发器进行"已经解决"


create trigger"sequence_b_ins" before insert on `sequence`


for each row


begin


 NEW.id = select max(id)+1 from `sequence`;


end



或者沿着这些线( 抱歉,没有测试)

原作者:
...