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);
    

我为我的数据库启用了事务日志,并看到以下两个 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

0

我通过向包含类的私有范围内的帮助类添加“hasStarted()”方法解决了这个问题,如下所示:

public class HelperClass {
  private ExperimentInstance experimentInstance;

  public HelperClass(ExperimentInstance experimentInstance) {
    this.experimentInstance = experimentInstance;
  }

  public void hasStarted() {
    experimentInstance.hasStarted = Boolean.TRUE;
    experimentInstance.update();
  }
}

public class ContainingClass extends UntypedActor {
  ...
  private HelperClass helperClass = new HelperClass(experimentInstance);
  ...
  new Timer().schedule(new TimerTask() {
    @Override
    public void run() {
      helperClass.hasStarted();
    }
  }, lifetimeInMs);
  ...

我相信这个问题是由“final”关键字引起的。

于 2013-10-31T13:00:18.413 回答