Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Oracle-Sequenzen entsprechen in MySQL

Ich konnte dieses Problem lösen, indem ich einfach die Vorschläge von @Akina und @RickJames kombinierte, danke euch beiden für ihre Unterstützung.

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

Hier ENGINE=InnoDB ist sehr wichtig. Um sicherzustellen, dass beim Lesen eine Sperrung auf Tabellenebene erfolgt, habe ich meinen App-Code wie folgt geändert:

Auto-Commit=FALSE

Dann

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

Dadurch wurde die eindeutige sequence number generiert auch bei mehreren gleichzeitigen Sitzungen.

Ich bin auf ein anderes Problem gestoßen, dass diese Lösung andere verlangsamt hat, wo ich Sequenz# generiere. Ich habe es gelöst, indem ich eine Sperre auf Zeilenebene anstelle einer Sperre auf Tabellenebene aktiviert habe, indem ich customer_id indiziert habe.

ALTER TABLE TABLE_NAME ADD INDEX (customer_id);

Ich hoffe, dies wird anderen helfen.