次の変更を行ったときに、以前に動作していた Play アプリケーションから OptimisticLockException がスローされるようになりました。
新しいフィールド hasStarted をエンティティに追加しました。
@Entity public class ExperimentInstance extends Model { @Version public int version; @Id public Long id; public boolean hasStarted; ...
以下によってデータベースで定義されます。
alter table experiment_instances add column has_started bit default 0;
次のように、TimerTask 内の新しいフィールドを更新します。
final ExperimentInstance runningInstance = ExperimentInstance.findById(experimentInstanceId); new Timer().schedule(new TimerTask() { @Override public void run() { if (runningInstance != null) { runningInstance.hasStarted = true; runningInstance.save(); } } }, lifetimeInMs);
データベースのトランザクション ログを有効にすると、次の 2 つの SQL ステートメントが表示されます。
update experiment_instances set has_started=true, version=3 where id=3721 and version=2
そしてずっと後:
update experiment_instances set status='FINISHED', version=3 where id=3721 and version=2
テーブルが以前に更新されたときに @Version 注釈付きフィールドが 2 から 3 に増加しないという問題は明らかです。ただし、この問題のデバッグをどこから開始すればよいかわかりません。
どんな助けでも大歓迎です。