sql >> Databasteknik >  >> RDS >> Mysql

StaleObjectStateException på högfrekventa uppdateringar

Det verkar som om du har konfigurerat Hibernate för att använda optimistisk samtidighetskontroll . Det betyder att din användartabell har ett versionsfält som inkrementeras i Hibernate vid varje raduppdatering.

Troligtvis börjar din transaktion i början av HTTP-förfrågan och slutar i slutet av HTTP-svaret. Det betyder att processen för att redigera en användare består av två transaktioner:en transaktion för att fylla i webbformuläret och en transaktion för att spara ändringarna.

I så fall kommer det inte att göra någon nytta att ändra isoleringsnivån för databasen. Mest troligt är allt du kommer att få sämre prestanda och skalbarhet .

Det är ingen dålig sak att ha StaleObjectException s. Det speglar den verkliga världen - människor arbetar faktiskt med samma sak då och då och konflikter kan uppstå. Frågan är, när en konflikt har upptäckts, hur löser man den på ett sätt som är tillfredsställande för slutanvändarna? Kan det lösas utan hjälp av användaren?

Möjliga strategier kan vara att

  • skriv över den tidigare användarens ändringar (ofta inte vad du vill - därav behovet av samtidighetskontroll),

  • visa ett felmeddelande som ber användaren att uppdatera och utföra sina ändringar igen,

  • slå automatiskt samman ändringarna utan att skriva över föregående användares ändringar (ibland möjligt)

  • informera användaren om att hans data är föråldrade och erbjuda honom ett sätt att manuellt slå samman sina ändringar

Allt beror på sammanhanget.



  1. Skicka lösenord över webben

  2. Byt namn på en kolumn i mysql-tabellen utan att behöva upprepa dess typdefinition

  3. Mysql Förbättra sökprestanda med jokertecken (%%)

  4. JDBC med MySQL riktigt långsam, vet inte varför