@Akinaと@RickJamesの提案を組み合わせることで、この問題を解決することができました。両方のサポートに感謝します。
create table my_seq(
min_value integer,
Max_value integer,
last_value integer,
increment_by tinyint,
customer_id integer)ENGINE = InnoDB;
ここでENGINE=InnoDB
非常に重要です。読み取り中にテーブルレベルのロックが行われるようにするために、アプリコードを次のように変更しました。
Auto-Commit=FALSE
次に、
//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;
これにより、一意のsequence number
が生成されていました 複数の同時セッションの場合でも。
私は別の問題に直面しました。この解決策が遅くなったということです。他の問題では、シーケンス番号を生成します。 customer_idにインデックスを付けることで、テーブルレベルのロックではなく行レベルのロックを有効にすることで解決しました。
ALTER TABLE TABLE_NAME ADD INDEX (customer_id);
これが他の人の助けになることを願っています。