Mysql
 sql >> Base de données >  >> RDS >> Mysql

StaleObjectStateException sur les mises à jour à haute fréquence

Il semble que vous ayez configuré Hibernate pour utiliser contrôle de concurrence optimiste . Cela signifie que votre table User a un champ de version qu'Hibernate incrémente à chaque mise à jour de ligne.

Très probablement, votre transaction commence au début de la requête HTTP et se termine à la fin de la réponse HTTP. Cela signifie que le processus de modification d'un utilisateur consiste en deux transactions :une transaction pour remplir le formulaire Web et une transaction pour enregistrer les modifications.

Dans ce cas, changer le niveau d'isolement de la base de données ne servira à rien. Très probablement, tout ce que vous obtiendrez est moins bonnes performances et évolutivité .

Ce n'est pas une mauvaise chose d'avoir StaleObjectException s. Cela reflète le monde réel - les gens travaillent effectivement sur la même chose de temps en temps et des conflits peuvent survenir. La question est la suivante :lorsqu'un conflit a été détecté, comment le résolvez-vous de manière satisfaisante pour les utilisateurs finaux ? Peut-il être résolu sans l'aide de l'utilisateur ?

Les stratégies possibles pourraient être de

  • écraser les modifications de l'utilisateur précédent (souvent pas ce que vous voulez - d'où la nécessité d'un contrôle de la concurrence),

  • afficher un message d'erreur demandant à l'utilisateur d'actualiser et d'effectuer à nouveau ses modifications,

  • fusionne automatiquement les modifications sans écraser les modifications de l'utilisateur précédent (parfois possible)

  • informer l'utilisateur de l'obsolescence de ses données et lui proposer un moyen de fusionner manuellement ses modifications

Tout dépend du contexte.