sql >> Databáze >  >> RDS >> Mysql

Ekvivalent sekvencí Oracle v MySQL

Tento problém se mi podařilo vyřešit jen kombinací návrhů @Akina a @RickJames, děkuji oběma za podporu.

create table my_seq(
min_value integer,
Max_value integer,
last_value integer,
increment_by tinyint,
customer_id integer)ENGINE = InnoDB;

Zde ENGINE=InnoDB je velmi důležité. Abych se ujistil, že při čtení dojde k uzamčení na úrovni tabulky, upravil jsem kód aplikace na:

Auto-Commit=FALSE

Potom,

//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;

Toto generovalo jedinečné sequence number i v případě více souběžných relací.

Čelil jsem dalšímu problému, že toto řešení zpomalilo, kde generuji sekvenci #. Vyřešil jsem to povolením zámku na úrovni řádku namísto zámku na úrovni tabulky indexováním customer_id.

ALTER TABLE TABLE_NAME ADD INDEX (customer_id);

Doufám, že to bude plnohodnotná pomoc pro ostatní.




  1. if (vyberte počet (sloupec) z tabulky)> 0 potom

  2. Jak zajistíte, aby se hodnoty z protokolovací tabulky shodovaly s objekty v jiných tabulkách?

  3. Průvodce automatizací databází s několikanines ClusterControl

  4. Nelze se připojit k žádnému ze zadaných hostitelů MySQL