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

Verrouillage au niveau de la table en veille prolongée

"Sélectionner ... pour la mise à jour" est pris en charge dans Hibernate via LockMode.UPGRADE que vous pouvez définir, par exemple, dans un NamedQuery .

Mais l'utilisation du verrouillage application/manuel des lignes de table présente plusieurs inconvénients (en particulier lorsqu'une connexion à la base de données est interrompue à mi-chemin d'une transaction) et votre procédure de mise à jour peut s'en passer :

  • Commencer la transaction.
  • mise à jour de l'ensemble de tables state='PENDING', server_id=1 where state='IN PROGRESS' ;
  • Valider la transaction
  • sélectionnez dans le tableau où state='PENDING' et server_id=1 ;
  • [traiter les enregistrements]

Chaque serveur doit avoir un numéro unique pour que cela fonctionne, mais il sera moins sujet aux erreurs et vous laisserez le SGBD faire ce pour quoi il est censé être bon :l'isolation (voir ACID ).