0

次の変更を行ったときに、以前に動作していた 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 に増加しないという問題は明らかです。ただし、この問題のデバッグをどこから開始すればよいかわかりません。

どんな助けでも大歓迎です。

4

1 に答える 1