MyISAMシーケンステーブルをInnoDBに変更するだけで、update...set...=last_insert_id()
の後にシーケンステーブルに更新ロックが作成されることを確認しました。 ステートメントですが、トランザクションがコミットされる前です。 MyISAMシーケンスを使用する場合、これらのロックは作成されません。したがって、「簡単な」アプローチはパフォーマンスに悪影響を与える可能性があります。
これが私が思いついたものです。これが最も簡単な方法かどうかはわかりませんが、機能しています。
- これ
ごと 答えて、既存のシーケンステーブルを削除し、単一の列で再定義します
uid BIGINT(20) UNSIGNED NOT NULL PRIMARY KEY auto_increment
- 次のストアドプロシージャを作成します。a)引数としてシーケンス名を取り、b)シーケンスへの挿入を行い、c)LAST_INSERT_ID()を返します
-
MySQLMaxValueIncrementer
を拡張するJavaクラスを記述しますgetNextKey()
でストアドプロシージャを呼び出します 方法。SimpleJdbcCall
を使用しています これを行うインスタンス。 -
DataFieldMaxValueIncrementerFactory
を実装するJavaクラスを記述しますgetIncrementer()
からステップ#3のインスタンスを返します メソッド - バッチ構成で、
org.springframework.batch.core.repository.support.JobRepositoryFactoryBean
を更新します 手順4のインクリメンターファクトリを使用するための構成