Wygląda na to, że Hibernate został skonfigurowany do używania optymistyczne sterowanie współbieżnością . Oznacza to, że Twoja tabela użytkowników zawiera pole wersji, które Hibernate zwiększa przy każdej aktualizacji wiersza.
Najprawdopodobniej Twoja transakcja rozpoczyna się na początku żądania HTTP, a kończy na końcu odpowiedzi HTTP. Oznacza to, że proces edycji użytkownika składa się z dwóch transakcji:jednej transakcji do wypełnienia formularza internetowego i jednej transakcji do zapisania zmian.
W takim przypadku zmiana poziomu izolacji bazy danych nie przyniesie niczego dobrego. Najprawdopodobniej otrzymasz tylko gorsza wydajność i skalowalność .
Nie jest źle mieć StaleObjectException
s. Odzwierciedla rzeczywisty świat – ludzie od czasu do czasu pracują nad tym samym i mogą wystąpić konflikty. Pytanie brzmi, kiedy wykryty zostanie konflikt, jak rozwiązać go w sposób satysfakcjonujący użytkowników końcowych? Czy można go rozwiązać bez pomocy użytkownika?
Możliwe strategie to
-
nadpisz zmiany poprzedniego użytkownika (często nie to, czego chcesz - stąd potrzeba kontroli współbieżności),
-
pokaż komunikat o błędzie, prosząc użytkownika o odświeżenie i ponowne wprowadzenie zmian,
-
automatycznie scalaj zmiany bez nadpisywania zmian wprowadzonych przez poprzedniego użytkownika (czasami jest to możliwe)
-
poinformuj użytkownika o nieaktualności jego danych i zaoferuj mu możliwość ręcznego scalenia jego zmian
Wszystko zależy od kontekstu.