Ich habe eine Menge Beiträge zu diesem Thema gefunden, aber alle Antworten waren nur Links zu Dokumentationen ohne Beispielcode, d. H. Wie man Parallelität in der Praxis verwendet.Parallelität mit Hibernate im Frühjahr
Meine Situation: Ich habe eine Entität House
mit (für simplification) zwei Attribute, number
(die ID) und owner
. Die Datenbank wird initialisiert mit 10 Houses
mit number
1-10 und owner
immer null
.
Ich möchte dem Haus einen neuen Besitzer zuweisen, der momentan keinen Besitzer hat, und den kleinsten number
. Mein Code sieht wie folgt aus:
@Transactional
void assignNewOwner(String newOwner) {
//this is flagged as @Transactional too
House tmp = houseDao.getHouseWithoutOwnerAndSmallestNumber();
tmp.setOwner(newOwner);
//this is flagged as @Transactional too
houseDao.update(tmp);
}
Für mein Verständnis, obwohl der @Transactional
verwendet wird, die gleiche House
verschiedenen Eigentümern doppelt vergeben werden könnten, wenn zwei Anfragen die gleichen leeren House
wie tmp
holen. Wie kann ich sicherstellen, dass dies nicht passieren kann?
Ich weiß, einschließlich der Aktualisierung in der Auswahl der leeren House
würde das Problem lösen, aber in naher Zukunft möchte ich ändern/arbeiten mit dem tmp
Objekt mehr.
Das 'houseDao.update (tmp);' ist unnötig, da 'tmp' eine verwaltete Entität ist (Sie befinden sich in einer transaktionalen Methode). Die Änderungen werden beibehalten, ohne dass ein separates 'update()' benötigt wird. – Kayaman