sql >> Databasteknik >  >> RDS >> Mysql

Oracle-sekvenser motsvarande i MySQL

Jag kunde lösa det här problemet genom att bara kombinera förslag från @Akina och @RickJames , tack båda för ert stöd.

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

Här ENGINE=InnoDB är mycket viktigt. För att se till att det finns tabellnivålåsning under läsning har jag ändrat min appkod till:

Auto-Commit=FALSE

Sedan,

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

Detta genererade det unika sequence number även vid flera samtidiga sessioner.

Jag har ställts inför ett annat problem, att den här lösningen har saktat ner andra där jag genererar sekvens#. Jag har löst det genom att aktivera ett radnivålås istället för tabellnivålås genom att indexera kund_id.

ALTER TABLE TABLE_NAME ADD INDEX (customer_id);

Hoppas detta kommer att vara till hjälp för andra.




  1. Använda en variabel i MySQL Välj utlåtande i en Where-sats

  2. När började oracle stödja top:select top ? p2_.PRODUCT_ID från PRODUCT?

  3. Hur kan jag automatiskt skapa en e-postadress för mina webbplatsmedlemmar?

  4. GetOracleDecimal Minnesläcka