2012-09-19 3 views
0

J'ai deux tables, une appelée utilisateur, stocke les utilisateurs, et une appelée processus qui stocke la liste des processus actifs mettant à jour les utilisateurs. Ce que je veux faire est de pouvoir sélectionner 50 utilisateurs obsolètes, les verrouiller en insérant un enregistrement dans la table de processus avec la plage d'id utilisateur que je mets à jour, de sorte que si un second processus est déclenché haut, il ne commencera pas à traiter les mêmes utilisateurs.Dois-je utiliser des verrous de table ou des transactions?

Pour résumer:

  1. Sélectionnez dans la table de processus, le dernier identifiant traité
  2. Sélection dans la table utilisateur 50 ids> dernier traitement id
  3. Insérer dans la table de processus un nouveau record avec la plage d'identifiants que je suis sur le point de traiter

Je veux m'assurer que si 2 processus (P1 et P2) sont allumés en même temps, les 3 étapes sont exécutées consécutivement pour chaque processus. à savoir:

  • P1 étape 1
  • P1 étape 2
  • P1 étape 3
  • étape P2 1
  • étape P2 2
  • P2 étape 3

et non

  • P1 étape 1
  • P2 étape 1
  • P1 étape 2
  • etc.

Comment dois-je faire? Transactions ou verrous de table? Ou même quelque chose d'autre?

Mes tables sont celles d'InnoDB.

Merci!

Répondre

0

Verrous de niveau ligne. L'avantage d'InnoDB est qu'il supporte les verrous de niveau ligne. Vous devez verrouiller les enregistrements que vous souhaitez mettre à jour pour cette transaction. Vous devriez utiliser une transaction par lot, de cette façon vous pouvez les libérer agressivement lorsque vous avez terminé.

Voir: http://dev.mysql.com/doc/refman/5.0/en/innodb-lock-modes.html

+0

Merci pour votre réponse. Le fait est que chaque mise à jour peut prendre beaucoup de temps et je ne veux pas garder quoi que ce soit enfermé dans la base de données pendant longtemps. Je cherche juste un moyen de m'assurer que mes 3 étapes sont exécutées consécutivement. –

Questions connexes