Hallo,
mag eine ziemliche Anfängerfrage sein, ich stelle sie aber trotzdem einfach mal.
Es gibt in einer Tabelle Datensätze, welche jeweils ein Attribut "gültig" (boolean) haben. Jeder Datensatz ist am Anfang gültig, kann dann genau einmal benutzt (selektiert) werden, wobei dann das flag auf "ungültig" gesetzt wird. Also mit JPA in etwa so:
Query q=entityManager.createQuery("select b from ... where b.valid = true");
List l=q.getResultList();
Object o=l.get(0);
o.valid=false;
entityManager.merge(o);
Eigentlich banal. Aber wie stellt man sicher, dass zwei quasi gleichzeitig ablaufende Requests wirklich auf keinen Fall das gleiche Objekt selektieren? Also eine Synchronisation des oben angegebenen Codes, aber nicht auf Codeebene, sondern in der Datenbank? Im Code ist es aus bestimmten Gründen nicht gut möglich.
Was mir spontan dazu einfällt ist SELECT FOR UPDATE bei Postgres/MySQL. Aber eigentlich denke ich, der beschrieben Fall ist so ein Standardfall, der ständig vorkommt, dass es da doch auch eine einfache Standardlösung vorkommen muss. Sowas muss eine Datenbank an sich doch automatisch synchronisieren können, würde ich vermuten. Aber bin beim Thema "Datenbanken" leider noch ziemlicher Anfänger.
mag eine ziemliche Anfängerfrage sein, ich stelle sie aber trotzdem einfach mal.
Es gibt in einer Tabelle Datensätze, welche jeweils ein Attribut "gültig" (boolean) haben. Jeder Datensatz ist am Anfang gültig, kann dann genau einmal benutzt (selektiert) werden, wobei dann das flag auf "ungültig" gesetzt wird. Also mit JPA in etwa so:
Query q=entityManager.createQuery("select b from ... where b.valid = true");
List l=q.getResultList();
Object o=l.get(0);
o.valid=false;
entityManager.merge(o);
Eigentlich banal. Aber wie stellt man sicher, dass zwei quasi gleichzeitig ablaufende Requests wirklich auf keinen Fall das gleiche Objekt selektieren? Also eine Synchronisation des oben angegebenen Codes, aber nicht auf Codeebene, sondern in der Datenbank? Im Code ist es aus bestimmten Gründen nicht gut möglich.
Was mir spontan dazu einfällt ist SELECT FOR UPDATE bei Postgres/MySQL. Aber eigentlich denke ich, der beschrieben Fall ist so ein Standardfall, der ständig vorkommt, dass es da doch auch eine einfache Standardlösung vorkommen muss. Sowas muss eine Datenbank an sich doch automatisch synchronisieren können, würde ich vermuten. Aber bin beim Thema "Datenbanken" leider noch ziemlicher Anfänger.