私はPlayFramework2でEbeanを使用していますが、このような種類のOptimisticLockExceptionが発生することがあります。
play.core.ActionInvoker$$anonfun$receive$1$$anon$1: Execution exception [[OptimisticLockException: Data has changed. updated [0] rows sql[update manager set modification_time=?, session_id=?, expiration_date=? where id=? and rating=? and creation_time=? and modification_time=? and name=? and surname=? and login=? and password_hash=? and email=? and session_id=? and expiration_date=?] bind[null]]]
これは、データベースへのアクセスを開始するアクターが少ない場合に発生します。
したがって、Managerクラスは次のとおりです。
public class Manager extends Model {
@Getter @Setter
Long id;
@Getter @Setter
private String name;
@Getter @Setter
private String surname;
@Column(unique = true)
@Getter @Setter
private String login;
@Getter @Setter
private String passwordHash;
@Getter @Setter
private String email;
@Embedded
@Getter @Setter
private ManagerSession session;
@Getter
private Timestamp creationTime;
@Getter
private Timestamp modificationTime;
@Override
public void save() {
this.creationTime = new Timestamp(System.currentTimeMillis());
this.modificationTime = new Timestamp(System.currentTimeMillis());
super.save();
}
@Override
public void update() {
this.modificationTime = new Timestamp(System.currentTimeMillis());
super.update();
}
}
Ebeanはサポートしていないため、代わりに@PrePersistアノテーションを使用するsave()およびupdate()フック。私が知っているように、@ Versionアノテーションは常に楽観的なロックモードをもたらすので、私はそのようなトリックを使い始めます。Optimistickロックとは何かを知っていますが、多くのアクターが同じdbレコードを変更する必要がある場合、最後の変更が優先される場合、この状況をどのように解決する必要がありますか?