1

私は最近、オラクルから mysql に移行する過程にあり、mysql でシーケンスに似たものを実装する方法が良い方法である場合、アドバイスが必要です。

基本的に、現在それを実装する方法は、Oracleの各シーケンスに対してmysqlに個別のテーブルを作成し、last_numberを表す単一の列を持ち、新しい行を挿入するたびにこの列をインクリメントすることです。これは、私ができる別の方法ですそれを行うには、各シーケンスを表す複数の行を持つ単一のテーブルを作成し、挿入を行うたびに各行を個別にインクリメントします。

それを行う別の簡単な方法は、データを挿入するときに、関連する列で select max()+1 を実行することです。

私は基本的に select max()+1 オプションに切り替えることを考えています. select max()+1 を使用するときに、現在認識していない落とし穴があります。

また、auto_increment と関数 last_insert_id() を使用していない理由は、ANSI 標準に従いたいからです。

ありがとう。

4

2 に答える 2

2

まず第一にmax()+1、高い分離レベルでトランザクションを使用する場合、バージョンがシーケンスを提供することは保証されていません。

シーケンスを通常使用する方法 (避けられない場合) は、AUTO_INCREMENTINSERT INTOit, SELECT last_insert_id(),を含むテーブルを作成することDELETE FROM table WHERE field<$LASTINSERTIDです。もちろん、これはストアドプロシージャで行われます。

于 2012-12-20T09:50:07.650 に答える
1

2 つのセッションが両方とも実行されているという点で、読み取りの一貫性の問題があります ...

insert into ... select max(..)+1 from ...

... 同時に、両方とも max(...) の同じ値を参照するため、両方とも同じ新しい値を挿入しようとします。

最大値のテーブルメソッドにも同じ問題があり、ロックメカニズムを使用して、複数のセッションが同じ値を読み取らないようにする必要があります。これにより、テーブルへの挿入がシリアル化される同時実行性の問題が発生します。

于 2012-12-20T09:45:25.947 に答える