Det ser ud til, at du har konfigureret Hibernate til at bruge optimistisk samtidighedskontrol . Det betyder, at din brugertabel har et versionsfelt, der stiger i Hibernate ved hver rækkeopdatering.
Mest sandsynligt starter din transaktion i begyndelsen af HTTP-anmodningen og slutter i slutningen af HTTP-svaret. Det betyder, at processen med at redigere en bruger består af to transaktioner:en transaktion til at udfylde webformularen og en transaktion til at gemme ændringerne.
I så fald vil det ikke nytte noget at ændre databasens isolationsniveau. Det eneste, du sandsynligvis får, er dårligere ydeevne og skalerbarhed .
Det er ikke en dårlig ting at have StaleObjectException
s. Det afspejler den virkelige verden - folk arbejder faktisk med det samme en gang imellem, og der kan opstå konflikter. Spørgsmålet er, når en konflikt er blevet opdaget, hvordan løser man den så på en måde, der er tilfredsstillende for slutbrugerne? Kan det løses uden hjælp fra brugeren?
Mulige strategier kunne være at
-
overskriv den tidligere brugers ændringer (ofte ikke hvad du ønsker - derfor behovet for samtidighedskontrol),
-
vis en fejlmeddelelse, der beder brugeren om at opdatere og udføre sine ændringer igen,
-
automatisk flette ændringerne uden at overskrive den tidligere brugers ændringer (nogle gange muligt)
-
informere brugeren om forældede data og tilbyde ham en måde at manuelt flette sine ændringer
Det hele afhænger af konteksten.