Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Sequências Oracle equivalentes no MySQL


Consegui resolver esse problema apenas combinando sugestões de @Akina e @RickJames , obrigado a ambos pelo suporte.
create table my_seq(
min_value integer,
Max_value integer,
last_value integer,
increment_by tinyint,
customer_id integer)ENGINE = InnoDB;

Aqui ENGINE=InnoDB é muito importante. Para garantir que haja bloqueio de nível de tabela durante a leitura, modifiquei o código do meu aplicativo para:

Auto-Commit=FALSE

Então,
//very import to begin the transaction
begin;
select last_number from my_seq where customer_id=? FOR UPDATE;

Read the result in App.

update my_seq set last_number=last_number+1 where customer_id=?;
commit;

Isso estava gerando o sequence number exclusivo mesmo no caso de várias sessões simultâneas.

Eu enfrentei outro problema, que esta solução desacelerou outras onde eu gero sequence#. Eu resolvi isso habilitando um bloqueio de nível de linha em vez de bloqueio de nível de tabela indexando customer_id.

ALTER TABLE TABLE_NAME ADD INDEX (customer_id);

Espero que isso seja uma ajuda completa para os outros.