Hallo,
tut mir ja fast leid, das mal wieder zu fragen, aber mir ist das immer noch unklar, aber ich brauch das jetzt demnächst..
Wenn zwei Transaktionen die gleichen Datenbankzeilen verändern wollen, wie bekommt man das dan synchronisiert? Handelt sich dabei optimalerweise um JPA 1.0, aber auch "natives hibernate" oder nofalls SQL ist ok.
Anwendungsbeispiel: Ein simpler Zähler, der bei Aufruf einer Webseite inkrementiert wird. Da können ja mehrere Zugriffe parallel stattfinden. Aber jeder Aufruf soll wirklich SEINEN eindeutigen Zählerstand bekommen, also schön synchronisiert erhöhen.
Nach meinen Kenntnisstand kann man Zeilen mit SELECT FOR UPDATE locken und wenn eine Transaktion dann versucht, eine Zeile zu schreiben, die bereits von einer anderen gelockt war, klappt das nicht, es gibt ein rollback und eine exception.
Und auch sonst (ich kenn mich damit wirklich nur oberflächlich aus) basieren alle Möglichkeiten, das irgendwie mit Locking zu machen, darauf, dass eine der beiden Transaktionen bei Kollisionen nicht ausgeführt, ge-rollback-ed und eine Exception ausgelöst wird.
Aber das hilft ja bei der Anwendung nicht weiter. Wenn eine Exception ausgelöst wird, wurde ja kein Zählerstand ermitelt für diesen Aufruf. Was also tun? Erneut versuchen bis es irgendwann klappt? Also quasi Endllosschleife, die immer wieder probiert und dann abbricht wenns funktioniert hat?
oder wie löst man sowas korrekt?
Gruß+Danke Danke
Jan
tut mir ja fast leid, das mal wieder zu fragen, aber mir ist das immer noch unklar, aber ich brauch das jetzt demnächst..
Wenn zwei Transaktionen die gleichen Datenbankzeilen verändern wollen, wie bekommt man das dan synchronisiert? Handelt sich dabei optimalerweise um JPA 1.0, aber auch "natives hibernate" oder nofalls SQL ist ok.
Anwendungsbeispiel: Ein simpler Zähler, der bei Aufruf einer Webseite inkrementiert wird. Da können ja mehrere Zugriffe parallel stattfinden. Aber jeder Aufruf soll wirklich SEINEN eindeutigen Zählerstand bekommen, also schön synchronisiert erhöhen.
Nach meinen Kenntnisstand kann man Zeilen mit SELECT FOR UPDATE locken und wenn eine Transaktion dann versucht, eine Zeile zu schreiben, die bereits von einer anderen gelockt war, klappt das nicht, es gibt ein rollback und eine exception.
Und auch sonst (ich kenn mich damit wirklich nur oberflächlich aus) basieren alle Möglichkeiten, das irgendwie mit Locking zu machen, darauf, dass eine der beiden Transaktionen bei Kollisionen nicht ausgeführt, ge-rollback-ed und eine Exception ausgelöst wird.
Aber das hilft ja bei der Anwendung nicht weiter. Wenn eine Exception ausgelöst wird, wurde ja kein Zählerstand ermitelt für diesen Aufruf. Was also tun? Erneut versuchen bis es irgendwann klappt? Also quasi Endllosschleife, die immer wieder probiert und dann abbricht wenns funktioniert hat?
oder wie löst man sowas korrekt?
Gruß+Danke Danke
Jan
Zuletzt bearbeitet: