InnoDBストレージエンジンとトランザクションでMySQLを使用しており、問題が発生しました.MySQLでOracleのSEQUENCEをエミュレートするには良い方法が必要です。要件は次のとおりです。 - 同時実行をサポート - トランザクションの安全性 - 最大のパフォーマンス(最小限のロックとデッドロックを意味する)MySQLでトランザクション安全なシーケンスをエミュレートする
値の一部が使用できない場合我々は、順番に、すなわちギャップがOKです、気にしません。カウンタを使って別々のInnoDBテーブルを作成することで簡単に達成することができますが、これはトランザクションに参加し、ロックを導入して待機することを意味します。手動ロック、その他のアイデアやベストプラクティスのMyISAMテーブルを試してみたいと思っていますか?
ありがとう - それはほぼ正確にそれを行うすべてのストアドプロシージャの後に我々が思い付いたものです。 –
レコードが存在しない場合は、このクエリを使用します。 (seq_name、seq_current)VALUE( 'foo'、(@next:= 1)) UPDATE seq_current =(@next:= seq_current + 1);次にSELECT @next;を呼び出します。あなたはqu1j0t3の答えでIWATさんのコメントを結合することもできます – iwat
: 'DUPLICATE KEY UPDATEのseq_current = LAST_INSERT_ID(seq_current + 1)ON sequences2(SEQ_NAME、seq_current)VALUES( 'foo' で、LAST_INSERT_ID(1))。INSERT INTO;' 'SELECT LAST_INSERT_ID();'を呼び出すか、アプリケーション・ドライバーを使用している場合は、組み込みの自動インクリメント・コールを使用してください(例えば、jdbcの 'Statement#getGeneratedKeys')。 – Alden