2015-10-15 5 views
0

Я создал эту функцию MySQLMYSQL Последовательность Функция

delimiter // 
create function seq(tag int(10)) returns int 
begin 
update seq set val=last_insert_id(val+1) where tag_code=tag ; 
return last_insert_id(); 
end 
// 
delimiter ; 
CREATE TABLE `seq` (
    `tag_code` int(1) NOT NULL, 
    `val` int(10) unsigned NOT NULL, 
    PRIMARY KEY (`tag_code`) 
) ENGINE=InnoDb DEFAULT CHARSET=latin1 
insert into seq values(1,100); 
insert into seq values(2,100); 

Он работает отлично с InnoDB, но иногда мой вызов функции получения тайм-аут. Я планирую переключить настольный движок на MyISAM, но я беспокоюсь о проблемах с параллелизмом . Параллельный вызов этой функции может возвращать ту же последовательность

Кто-нибудь это делал раньше?

ответ

0

Поведение функции last_insert_id() не зависит от таблицы. Если бы он мог вернуть одно и то же значение для двух независимых вызовов, это означало бы, что функция автоматического инкрементции будет нарушена, а 2 записи с полем автоинкремента потенциально могут иметь одинаковое значение.

Кроме того, возвращаемое значение поддерживается для каждого соединения, поэтому функция будет возвращать разные значения для разных соединений.

+0

Кажется, мне нужно выполнить стресс-тест, тогда только я могу ответить –