sql >> Database >  >> RDS >> Mysql

StaleObjectStateException op hoogfrequente updates

Het lijkt erop dat u Hibernate hebt geconfigureerd om optimistische gelijktijdigheidscontrole . Dat betekent dat uw gebruikerstabel een versieveld heeft dat in de slaapstand wordt verhoogd bij elke rij-update.

Hoogstwaarschijnlijk begint uw transactie aan het begin van het HTTP-verzoek en eindigt het aan het einde van het HTTP-antwoord. Dit betekent dat het proces van het bewerken van een gebruiker uit twee transacties bestaat:één transactie om het webformulier in te vullen en één transactie om de wijzigingen op te slaan.

In dat geval heeft het veranderen van het isolatieniveau van de database geen zin. Waarschijnlijk krijg je alleen slechtere prestaties en schaalbaarheid .

Het is geen slechte zaak om StaleObjectException . te hebben s. Het weerspiegelt de echte wereld - mensen werken af ​​en toe aan hetzelfde en er kunnen conflicten optreden. De vraag is, wanneer een conflict is gedetecteerd, hoe los je dit dan op een voor de eindgebruikers bevredigende manier op? Kan het worden opgelost zonder de hulp van de gebruiker?

Mogelijke strategieën kunnen zijn om

  • de wijzigingen van de vorige gebruiker overschrijven (vaak niet wat u wilt - vandaar de noodzaak voor gelijktijdigheidscontrole),

  • een foutmelding weergeven waarin de gebruiker wordt gevraagd om te vernieuwen en zijn wijzigingen opnieuw uit te voeren,

  • automatisch de wijzigingen samenvoegen zonder de wijzigingen van de vorige gebruiker te overschrijven (soms mogelijk)

  • informeer de gebruiker over de oudheid van zijn gegevens en bied hem een ​​manier aan om zijn wijzigingen handmatig samen te voegen

Het hangt allemaal af van de context.



  1. Geavanceerde MySQL:correlaties vinden tussen poll-reacties

  2. NoSQL:leven zonder schema

  3. Unieke beperking van Postgres versus index

  4. MySQL:voorkeurskolomtype voor (product)prijzen?