У нас есть сущность, определенная как (id, name, school, & OTHER-FIELDS)
. id
автоматически назначается хранилищем данных. И мы хотим убедиться, что комбинация <name, school>
уникальна в хранилище данных.
Наш код пишется так:
/* First check uniqueness, then save */
public void savePerson(final Person newPerson) {
List<Person> existing = ofy().load().type(Person.clas)
.filter("name=", name)
.filter("school=", school)
.list();
if (existing == null || existing.isEmpty()) {
ofy.transact(new VoidWork() {
@Override
public void vrun() {
ofy.save.entity(newPerson).now();
}
}
}
}
Но все же бывает, если одновременно происходит несколько одинаковых вызовов savePerson (неизбежно мы с этим столкнемся), проверка дубликатов не пройдет (думаю потому, что при запуске вызова savePerson()
данные фактически не сохраняются), и мы находим в хранилище данных AppEngine это закончилось дублированием сущностей с одинаковыми <name, school>
комбинациями.
Мы действительно хотим убедиться, что в нашем хранилище данных, заданном <name, school
>, мы получим уникальный объект. Может ли кто-нибудь научить меня, как добавить проверку дубликатов атомарно? Это поможет, если я перенесу существующий код проверки объекта в контекст транзакции?
Например, будет ли работать следующий код?
/* Put filtering search into transaction too */
public void savePerson(final Person newPerson) {
ofy.transact(new VoidWork() {
@Override
public void vrun() {
List<Person> existing = ofy().load().type(Person.class)
.filter("name=", name)
.filter("school=", school)
.list();
if (existing == null || existing.isEmpty()) {
ofy.save.entity(newPerson).now();
}
}
}
}
Дайте мне знать, если я должен предоставить более подробную информацию.