Имаме обект, дефиниран като (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();
}
}
}
}
Уведомете ме, ако трябва да предоставя повече подробности.