sql >> データベース >  >> RDS >> Mysql

MySQLで同等のOracleシーケンス

    @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);

    これが他の人の助けになることを願っています。




    1. Oracle UCPドライバーとTomcat:スレッドの停止に失敗する

    2. OracleでMySQLのGROUP_CONCATに似たようなクエリを作成するにはどうすればよいですか?

    3. MySQLWorkbenchはMACOSX上のローカルMySQLサービスに接続できません

    4. SQLalchemy:変更がdbにコミットされない