当我进行以下修改时,我开始从以前工作的 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;但是,我不知道从哪里开始调试这个问题。
任何帮助将不胜感激。