Mysql
 sql >> Datenbank >  >> RDS >> Mysql

StaleObjectStateException bei häufigen Aktualisierungen

Anscheinend haben Sie Hibernate für die Verwendung von optimistische Nebenläufigkeitskontrolle . Das bedeutet, dass Ihre Benutzertabelle ein Versionsfeld hat, das Hibernate bei jeder Zeilenaktualisierung erhöht.

Höchstwahrscheinlich beginnt Ihre Transaktion am Anfang der HTTP-Anfrage und endet am Ende der HTTP-Antwort. Das bedeutet, dass der Bearbeitungsprozess eines Benutzers aus zwei Transaktionen besteht:einer Transaktion zum Ausfüllen des Webformulars und einer Transaktion zum Speichern der Änderungen.

In diesem Fall bringt es nichts, die Isolationsstufe der Datenbank zu ändern. Wahrscheinlich erhalten Sie nur schlechtere Leistung und Skalierbarkeit .

Es ist keine schlechte Sache, StaleObjectException zu haben s. Es spiegelt die reale Welt wider - Menschen arbeiten tatsächlich hin und wieder an derselben Sache, und Konflikte können auftreten. Die Frage ist, wenn ein Konflikt erkannt wurde, wie lösen Sie ihn auf eine Weise, die für die Endbenutzer zufriedenstellend ist? Kann es ohne die Hilfe des Benutzers gelöst werden?

Mögliche Strategien könnten sein,

  • überschreiben Sie die Änderungen des vorherigen Benutzers (oft nicht das, was Sie wollen - daher die Notwendigkeit der Gleichzeitigkeitskontrolle),

  • eine Fehlermeldung anzeigen, die den Benutzer auffordert, seine Änderungen zu aktualisieren und erneut durchzuführen,

  • automatisch die Änderungen zusammenführen, ohne die Änderungen des vorherigen Benutzers zu überschreiben (manchmal möglich)

  • Informieren Sie den Benutzer über die Veraltung seiner Daten und bieten Sie ihm eine Möglichkeit, seine Änderungen manuell zusammenzuführen

Es hängt alles vom Kontext ab.