Скажем, например, у меня есть следующая модель объективации:
@Cache
@Entity
public class CompanyViews implements Serializable, Persistence {
@Id
private Long id;
private Date created;
private Date modified;
private Long companyId;
........
private Integer counter;
........
@Override
public void persist() {
persist(false);
}
@Override
public void persist(Boolean async) {
ObjectifyService.register(Feedback.class);
// setup some variables
setUuid(UUID.randomUUID().toString().toUpperCase());
setModified(new Date());
if (getCreated() == null) {
setCreated(new Date());
}
// do the persist
if (async) {
ofy().save().entity(this);
} else {
ofy().save().entity(this).now();
}
}
}
Я хочу использовать поле счетчика для отслеживания количества просмотров, количества открытий или просто подсчета чего-либо с помощью целочисленного поля.
Что происходит сейчас, так это то, что для одного экземпляра GAE будет вызываться следующее:
A:
CompanyViews views = CompanyViews.findByCompanyId(...);
views.setCounter(views.getCounter() + 1);
views.persist();
и для другого случая:
B:
CompanyViews views = CompanyViews.findByCompanyId(...);
views.setCounter(views.getCounter() + 1);
views.persist();
Если они оба считывают счетчик одновременно или считывают счетчик до того, как другой экземпляр сохранит его, они перезапишут друг друга.
В MySQL / Postgres вы получаете блокировку на уровне строк, как сделать «блокировку на уровне строк» для объектов Objectify в GAE?